{"id":1361,"url":"https://github.com/snarfed/granary","last_synced_at":"2026-05-13T07:05:17.292Z","repository":{"id":2577060,"uuid":"3557653","full_name":"snarfed/granary","owner":"snarfed","description":"💬 The social web translator","archived":false,"fork":false,"pushed_at":"2026-01-07T18:49:07.000Z","size":10630,"stargazers_count":502,"open_issues_count":37,"forks_count":63,"subscribers_count":18,"default_branch":"main","last_synced_at":"2026-01-08T16:02:46.581Z","etag":null,"topics":["activitypub","activitystreams","atom","atproto","bluesky","converter","fediverse","feed","html","indieweb","json","jsonfeed","mastodon","microformats2","rest-api","rss"],"latest_commit_sha":null,"homepage":"https://granary.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snarfed.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":"2012-02-27T05:30:53.000Z","updated_at":"2026-01-07T18:49:11.000Z","dependencies_parsed_at":"2025-12-27T12:03:39.627Z","dependency_job_id":null,"html_url":"https://github.com/snarfed/granary","commit_stats":{"total_commits":3391,"total_committers":22,"mean_commits":"154.13636363636363","dds":"0.20731347685048662","last_synced_commit":"5cff4d831e380c3dcd6d2a22552cee9e059b22ee"},"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"purl":"pkg:github/snarfed/granary","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/sbom","scorecard":{"id":113188,"data":{"date":"2025-08-04","repo":{"name":"github.com/snarfed/granary","commit":"4961a69ed97d5433b5dbaf21b404b563d239ea77"},"scorecard":{"version":"v5.2.1-28-gc1d103a9","commit":"c1d103a9bb9f635ec7260bf9aa0699466fa4be0e"},"score":5.2,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 4 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/23 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: topLevel 'contents' permission set to 'write': .github/workflows/auto-merge-dependabot.yaml:13","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/auto-merge-dependabot.yaml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/snarfed/granary/auto-merge-dependabot.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/snarfed/granary/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/snarfed/granary/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/snarfed/granary/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/snarfed/granary/codeql-analysis.yml/main?enable=pin","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Creative Commons Zero v1.0 Universal: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#branch-protection"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-wj6h-64fc-37mp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/c1d103a9bb9f635ec7260bf9aa0699466fa4be0e/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T16:34:36.129Z","repository_id":2577060,"created_at":"2025-08-15T16:34:36.130Z","updated_at":"2025-08-15T16:34:36.130Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28354961,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T16:14:38.383Z","status":"ssl_error","status_checked_at":"2026-01-12T16:14:34.289Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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"}},"owner":{"login":"snarfed","name":"Ryan Barrett","uuid":"778068","kind":"user","description":"","email":"github@ryanb.org","website":"snarfed.org","location":"San Francisco","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/778068?u=5b3ff06dc08ee18aee4a7603e3598484218a7ed4\u0026v=4","repositories_count":149,"last_synced_at":"2025-11-29T02:45:56.203Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/snarfed","funding_links":[],"total_stars":3202,"followers":564,"following":112,"created_at":"2022-11-03T05:17:50.152Z","updated_at":"2025-11-29T02:45:56.203Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed/repositories"},"packages":[{"id":2752141,"name":"granary","ecosystem":"pypi","description":"The social web translator","homepage":"https://github.com/snarfed/granary","licenses":"Public domain","normalized_licenses":["Unlicense"],"repository_url":"https://github.com/snarfed/granary","keywords_array":["social","facebook","flickr","github","instagram","twitter","activitystreams","html","microformats2","meetup","mf2","atom","rss","jsonfeed"],"namespace":null,"versions_count":35,"first_release_published_at":"2015-07-10T22:37:46.000Z","latest_release_published_at":"2016-06-27T18:33:33.000Z","latest_release_number":"1.4.1","last_synced_at":"2026-01-06T19:25:29.491Z","created_at":"2022-04-10T11:11:04.693Z","updated_at":"2026-01-06T19:25:29.492Z","registry_url":"https://pypi.org/project/granary/","install_command":"pip install granary --index-url https://pypi.org/simple","documentation_url":"https://granary.readthedocs.io/","metadata":{"funding":null,"documentation":null,"classifiers":["Development Status :: 5 - Production/Stable","Environment :: Web Environment","Intended Audience :: Developers","License :: OSI Approved :: MIT License","License :: Public Domain","Programming Language :: Python :: 3","Programming Language :: Python :: 3.7","Programming Language :: Python :: 3.8","Programming Language :: Python :: 3.9","Topic :: Software Development :: Libraries :: Python Modules"],"normalized_name":"granary","project_status":null},"repo_metadata":{"id":2577060,"uuid":"3557653","full_name":"snarfed/granary","owner":"snarfed","description":"💬 The social web translator","archived":false,"fork":false,"pushed_at":"2024-05-01T05:39:51.000Z","size":9508,"stargazers_count":421,"open_issues_count":34,"forks_count":56,"subscribers_count":21,"default_branch":"main","last_synced_at":"2024-05-01T13:55:26.455Z","etag":null,"topics":["activitypub","activitystreams","atom","atproto","bluesky","converter","fediverse","feed","html","indieweb","json","jsonfeed","mastodon","microformats2","rest-api","rss"],"latest_commit_sha":null,"homepage":"https://granary.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/snarfed.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}},"created_at":"2012-02-27T05:30:53.000Z","updated_at":"2024-06-25T06:00:55.772Z","dependencies_parsed_at":"2023-07-05T17:00:23.431Z","dependency_job_id":"3f156e57-2732-4cc2-869f-e64e20fc43b8","html_url":"https://github.com/snarfed/granary","commit_stats":{"total_commits":3211,"total_committers":22,"mean_commits":"145.95454545454547","dds":0.2005605730302087,"last_synced_commit":"788815b19e5a055abc153b08eb28b0a2246b256e"},"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":217594386,"owners_count":16201672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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"},"owner_record":{"login":"snarfed","name":"Ryan Barrett","uuid":"778068","kind":"user","description":"","email":"","website":"https://snarfed.org/","location":"San Francisco","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/778068?u=5b3ff06dc08ee18aee4a7603e3598484218a7ed4\u0026v=4","repositories_count":133,"last_synced_at":"2024-06-11T15:40:58.354Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/snarfed","funding_links":[],"total_stars":2223,"followers":435,"following":111,"created_at":"2022-11-03T05:17:50.152Z","updated_at":"2024-06-11T15:41:03.011Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/snarfed/repositories"},"tags":[{"name":"v7.0","sha":"9a67b5c05587ba2d35740ce46338f0b4a9d83113","kind":"tag","published_at":"2024-06-25T04:53:39.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v7.0","html_url":"https://github.com/snarfed/granary/releases/tag/v7.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v7.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v7.0/manifests"},{"name":"v6.2","sha":"416c4de8ca15bd3f7221025f9c36dccb8fcc7b4b","kind":"tag","published_at":"2024-03-16T04:48:04.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v6.2","html_url":"https://github.com/snarfed/granary/releases/tag/v6.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.2/manifests"},{"name":"v6.1","sha":"67313b9c84adcd0aa0976e8f4618b495edb5d8e6","kind":"tag","published_at":"2023-09-16T14:18:44.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v6.1","html_url":"https://github.com/snarfed/granary/releases/tag/v6.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.1/manifests"},{"name":"v6.0","sha":"26b708fd2c6dc1170ec60aae850fccfb14b330ef","kind":"tag","published_at":"2023-03-22T20:36:59.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v6.0","html_url":"https://github.com/snarfed/granary/releases/tag/v6.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v6.0/manifests"},{"name":"v5.0","sha":"724d6b22aca97ce09035c2d338f5b3c15d5aff07","kind":"tag","published_at":"2022-12-04T04:26:47.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v5.0","html_url":"https://github.com/snarfed/granary/releases/tag/v5.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v5.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v5.0/manifests"},{"name":"v4.0","sha":"6321572d82a0b611e93cb244d294332aefa31132","kind":"tag","published_at":"2022-03-24T05:52:54.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v4.0","html_url":"https://github.com/snarfed/granary/releases/tag/v4.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v4.0/manifests"},{"name":"v3.2","sha":"c671181401cd0f6b6af52b07cb0e27240cb4f3c7","kind":"tag","published_at":"2021-09-16T05:03:40.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v3.2","html_url":"https://github.com/snarfed/granary/releases/tag/v3.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.2/manifests"},{"name":"v3.1","sha":"47ff426e784954f56fbdf124ca2b63367df31737","kind":"commit","published_at":"2021-04-04T06:26:08.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v3.1","html_url":"https://github.com/snarfed/granary/releases/tag/v3.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.1/manifests"},{"name":"v3.0","sha":"fbcb98949fe2ea74d6ab59962ecd1ee5439c635a","kind":"tag","published_at":"2020-04-08T19:53:50.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v3.0","html_url":"https://github.com/snarfed/granary/releases/tag/v3.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v3.0/manifests"},{"name":"v2.2","sha":"8bae17cb5e300e60d2fcff03a1b8efd097ce2506","kind":"tag","published_at":"2019-11-02T15:53:47.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v2.2","html_url":"https://github.com/snarfed/granary/releases/tag/v2.2","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.2","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.2/manifests"},{"name":"v2.1","sha":"7865904d9a83abb03eadea211a0a5f4f9625d239","kind":"tag","published_at":"2019-09-06T05:04:08.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v2.1","html_url":"https://github.com/snarfed/granary/releases/tag/v2.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.1/manifests"},{"name":"v2.0","sha":"4e4a1ca30380049388fb4d8e0c1fa2b6d38cbe65","kind":"tag","published_at":"2019-03-01T15:28:49.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v2.0","html_url":"https://github.com/snarfed/granary/releases/tag/v2.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v2.0/manifests"},{"name":"v1.15","sha":"500c4221ca03044f74187cf29744eeb671e6ce74","kind":"tag","published_at":"2019-02-28T17:59:31.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.15","html_url":"https://github.com/snarfed/granary/releases/tag/v1.15","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.15","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.15/manifests"},{"name":"v1.14","sha":"a82fda568302ccc659736a927d7cf6415ca0b55f","kind":"tag","published_at":"2018-11-13T07:04:38.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.14","html_url":"https://github.com/snarfed/granary/releases/tag/v1.14","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.14","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.14/manifests"},{"name":"v1.13","sha":"551c1aedbfea731b170f18e812c333e00622a7b1","kind":"tag","published_at":"2018-08-09T00:08:35.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.13","html_url":"https://github.com/snarfed/granary/releases/tag/v1.13","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.13","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.13/manifests"},{"name":"v1.12-docs","sha":"01cf83fbfecfe360adf23fa9c4f76fb362b6be49","kind":"commit","published_at":"2018-03-24T23:15:16.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.12-docs","html_url":"https://github.com/snarfed/granary/releases/tag/v1.12-docs","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.12-docs","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.12-docs/manifests"},{"name":"v1.12","sha":"53686a81d01861b48664f53516d3d43f4ca7db8f","kind":"tag","published_at":"2018-03-24T23:09:55.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.12","html_url":"https://github.com/snarfed/granary/releases/tag/v1.12","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.12","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.12/manifests"},{"name":"v1.11-docs","sha":"2904f7339da52082c5a8ea20f7d652d27417f3a0","kind":"commit","published_at":"2018-03-09T17:38:05.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.11-docs","html_url":"https://github.com/snarfed/granary/releases/tag/v1.11-docs","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.11-docs","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.11-docs/manifests"},{"name":"v1.11","sha":"d621f8ecbd0e0a86fc9a9b70415b20e88166e933","kind":"tag","published_at":"2018-03-09T17:10:11.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.11","html_url":"https://github.com/snarfed/granary/releases/tag/v1.11","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.11","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.11/manifests"},{"name":"v1.10-docs","sha":"d74521cfe0a87602d9786f1f752378a32857f233","kind":"commit","published_at":"2017-12-11T18:24:26.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.10-docs","html_url":"https://github.com/snarfed/granary/releases/tag/v1.10-docs","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.10-docs","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.10-docs/manifests"},{"name":"v1.10","sha":"803e859db0cff29ca9a8283e3af1a8d3cb707295","kind":"tag","published_at":"2017-12-10T22:25:56.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.10","html_url":"https://github.com/snarfed/granary/releases/tag/v1.10","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.10","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.10/manifests"},{"name":"v1.9","sha":"11a0f73352f7acc7f79053b40d24a7e61807a625","kind":"tag","published_at":"2017-10-27T04:51:34.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.9","html_url":"https://github.com/snarfed/granary/releases/tag/v1.9","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.9","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.9/manifests"},{"name":"v1.8","sha":"4c78f830471d017ba502e97c9abd30949ba60d13","kind":"tag","published_at":"2017-08-29T19:06:34.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.8","html_url":"https://github.com/snarfed/granary/releases/tag/v1.8","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.8","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.8/manifests"},{"name":"v1.7","sha":"c5692019551c43eae7372a091a58f4f070607f24","kind":"tag","published_at":"2017-02-28T07:54:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.7","html_url":"https://github.com/snarfed/granary/releases/tag/v1.7","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.7","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.7/manifests"},{"name":"v1.6","sha":"68a8023c5d19d379be681107c8361ac55fb1dc9d","kind":"tag","published_at":"2016-11-27T03:34:13.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.6","html_url":"https://github.com/snarfed/granary/releases/tag/v1.6","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.6","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.6/manifests"},{"name":"v1.5","sha":"d5aa3a7d282d5c84f8615b021c41a37d9678ad24","kind":"tag","published_at":"2016-08-25T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.5","html_url":"https://github.com/snarfed/granary/releases/tag/v1.5","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.5","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.5/manifests"},{"name":"v1.4.1","sha":"0464716d27ba4ed0bd6fa074e3123ad0f42ddbd0","kind":"tag","published_at":"2016-06-27T07:01:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.4.1","html_url":"https://github.com/snarfed/granary/releases/tag/v1.4.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.4.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.4.1/manifests"},{"name":"v1.4.0","sha":"72cdedb432344336117c406feaa68db77041075e","kind":"tag","published_at":"2016-06-27T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.4.0","html_url":"https://github.com/snarfed/granary/releases/tag/v1.4.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.4.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.4.0/manifests"},{"name":"v1.3.1","sha":"45cf0da54288df8f543a85d62a694d5f45a67257","kind":"tag","published_at":"2016-04-07T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.3.1","html_url":"https://github.com/snarfed/granary/releases/tag/v1.3.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.3.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.3.1/manifests"},{"name":"v1.3.0","sha":"df6974d21812e11c5f53926404bae07ba2c781d7","kind":"tag","published_at":"2016-04-06T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.3.0","html_url":"https://github.com/snarfed/granary/releases/tag/v1.3.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.3.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.3.0/manifests"},{"name":"v1.2.0","sha":"c8f6011e0dc65bd3e912293c99771f2e416e4e5b","kind":"tag","published_at":"2016-01-11T08:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.2.0","html_url":"https://github.com/snarfed/granary/releases/tag/v1.2.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.2.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.2.0/manifests"},{"name":"v1.1.0","sha":"d76ce1e35b200f84cac52a6a5a5717b83aeee966","kind":"tag","published_at":"2015-09-06T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.1.0","html_url":"https://github.com/snarfed/granary/releases/tag/v1.1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.1.0/manifests"},{"name":"v1.0.1","sha":"b6aa0629f8bcd25e555706a9cbed4ad6bfc8816c","kind":"tag","published_at":"2015-07-11T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.0.1","html_url":"https://github.com/snarfed/granary/releases/tag/v1.0.1","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.0.1","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.0.1/manifests"},{"name":"v1.0","sha":"b9d9b55510fa7dab61165871b9a717d7dcdff376","kind":"tag","published_at":"2015-07-10T07:00:00.000Z","download_url":"https://codeload.github.com/snarfed/granary/tar.gz/v1.0","html_url":"https://github.com/snarfed/granary/releases/tag/v1.0","dependencies_parsed_at":null,"dependency_job_id":null,"tag_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.0","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/tags/v1.0/manifests"}]},"repo_metadata_updated_at":"2024-09-07T06:49:33.758Z","dependent_packages_count":0,"downloads":936,"downloads_period":"last-month","dependent_repos_count":15,"rankings":{"downloads":16.914275113772266,"dependent_repos_count":3.7895385052639057,"dependent_packages_count":7.373338280337238,"stargazers_count":3.3199902097791676,"forks_count":5.712672809240705,"docker_downloads_count":null,"average":7.4219629836786565},"purl":"pkg:pypi/granary","advisories":[],"docker_usage_url":"https://docker.ecosyste.ms/usage/pypi/granary","docker_dependents_count":null,"docker_downloads_count":null,"usage_url":"https://repos.ecosyste.ms/usage/pypi/granary","dependent_repositories_url":"https://repos.ecosyste.ms/api/v1/usage/pypi/granary/dependencies","status":null,"funding_links":[],"critical":null,"issue_metadata":{"last_synced_at":"2024-09-07T06:35:51.185Z","issues_count":35,"pull_requests_count":318,"avg_time_to_close_issue":67673757.9,"avg_time_to_close_pull_request":144109.52215189874,"issues_closed_count":20,"pull_requests_closed_count":316,"pull_request_authors_count":5,"issue_authors_count":13,"avg_comments_per_issue":3.6,"avg_comments_per_pull_request":0.5345911949685535,"merged_pull_requests_count":290,"bot_issues_count":0,"bot_pull_requests_count":306,"past_year_issues_count":13,"past_year_pull_requests_count":181,"past_year_avg_time_to_close_issue":3947760.4285714286,"past_year_avg_time_to_close_pull_request":119783.59776536313,"past_year_issues_closed_count":7,"past_year_pull_requests_closed_count":179,"past_year_pull_request_authors_count":4,"past_year_issue_authors_count":8,"past_year_avg_comments_per_issue":3.769230769230769,"past_year_avg_comments_per_pull_request":0.3425414364640884,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":174,"past_year_merged_pull_requests_count":165,"issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/issues","maintainers":[{"login":"snarfed","count":19,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/snarfed"},{"login":"jamietanna","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jamietanna"}],"active_maintainers":[{"login":"snarfed","count":6,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/snarfed"}]},"versions_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/granary/versions","version_numbers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/granary/version_numbers","dependent_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/granary/dependent_packages","related_packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/granary/related_packages","codemeta_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages/granary/codemeta","maintainers":[{"uuid":"snarfed","login":"snarfed","name":null,"email":null,"url":null,"packages_count":8,"html_url":"https://pypi.org/user/snarfed/","role":null,"created_at":"2023-02-16T01:49:48.075Z","updated_at":"2023-02-16T01:49:48.075Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/snarfed/packages"},{"uuid":"jamietanna","login":"jamietanna","name":null,"email":null,"url":null,"packages_count":3,"html_url":"https://pypi.org/user/jamietanna/","role":null,"created_at":"2023-02-16T01:49:48.151Z","updated_at":"2023-02-16T01:49:48.151Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/jamietanna/packages"},{"uuid":"kylewm","login":"kylewm","name":null,"email":null,"url":null,"packages_count":5,"html_url":"https://pypi.org/user/kylewm/","role":null,"created_at":"2023-02-16T01:49:48.012Z","updated_at":"2023-02-16T01:49:48.012Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers/kylewm/packages"}],"registry":{"name":"pypi.org","url":"https://pypi.org","ecosystem":"pypi","default":true,"packages_count":775964,"maintainers_count":329396,"namespaces_count":0,"keywords_count":253930,"github":"pypi","metadata":{"funded_packages_count":52058},"icon_url":"https://github.com/pypi.png","created_at":"2022-04-04T15:19:23.364Z","updated_at":"2026-01-11T05:16:42.285Z","packages_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/packages","maintainers_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/maintainers","namespaces_url":"https://packages.ecosyste.ms/api/v1/registries/pypi.org/namespaces"}}],"commits":{"id":288506,"full_name":"snarfed/granary","default_branch":"main","total_commits":3852,"total_committers":23,"total_bot_commits":633,"total_bot_committers":1,"mean_commits":167.47826086956522,"dds":0.2323468328141225,"past_year_total_commits":366,"past_year_total_committers":5,"past_year_total_bot_commits":120,"past_year_total_bot_committers":1,"past_year_mean_commits":73.2,"past_year_dds":0.40437158469945356,"last_synced_at":"2025-12-11T11:49:34.619Z","last_synced_commit":"089e64c8da3158b8164be21a4a9249e9ebe48766","created_at":"2023-03-08T16:05:28.225Z","updated_at":"2025-12-11T11:48:56.473Z","committers":[{"name":"Ryan Barrett","email":"git@ryanb.org","login":"snarfed","count":2957},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":633},{"name":"Kyle Mahan","email":"kyle.mahan@gmail.com","login":"kylewm","count":105},{"name":"stedn","email":"will.stedden@gmail.com","login":"stedn","count":37},{"name":"Joel Auterson","email":"joel.auterson@gmail.com","login":"JoelOtter","count":36},{"name":"Jamie Tanna","email":"jamie@jamietanna.co.uk","login":"jamietanna","count":25},{"name":"Charlie Birks","email":"charlie@daft.games","login":"Daft-Freak","count":15},{"name":"Kartik Prabhu","email":"katsdaway@gmail.com","login":"kartikprabhu","count":8},{"name":"Emma Kuo","email":"emma.c.kuo@gmail.com","login":"notenoughneon","count":7},{"name":"John Choi","email":"isnbh0@gmail.com","login":"isnbh0","count":6},{"name":"Kyle Mahan","email":"kyle@kylewm.com","login":null,"count":3},{"name":"Barnaby Walters","email":"barnaby@waterpigs.co.uk","login":"barnabywalters","count":3},{"name":"Stephen Paul Weber","email":"singpolyma@singpolyma.net","login":"singpolyma","count":3},{"name":"sknebel","email":"sknebel","login":"sknebel","count":3},{"name":"Benjamin Esham","email":"benjamin@esham.io","login":"bdesham","count":2},{"name":"ImgBotApp","email":"ImgBotHelp@gmail.com","login":"ImgBotApp","count":2},{"name":"James Ravenscroft","email":"ravenscroftj@gmail.com","login":"ravenscroftj","count":1},{"name":"Tantek Çelik","email":"blog@tantek.com","login":"tantek","count":1},{"name":"Tim Vergenz","email":"vergenzt@gmail.com","login":"vergenzt","count":1},{"name":"jeremycherfas","email":"jcherfas@mac.com","login":"jeremycherfas","count":1},{"name":"Sourcery AI","email":"","login":null,"count":1},{"name":"Kyle Mahan","email":"kyle+github@kylewm.com","login":null,"count":1},{"name":"sebsel","email":"sebsel@seblog.nl","login":"sebsel","count":1}],"past_year_committers":[{"name":"Ryan Barrett","email":"git@ryanb.org","login":"snarfed","count":218},{"name":"dependabot[bot]","email":"49699333+dependabot[bot]","login":"dependabot[bot]","count":120},{"name":"Charlie Birks","email":"charlie@daft.games","login":"Daft-Freak","count":15},{"name":"Joel Auterson","email":"joel.auterson@gmail.com","login":"JoelOtter","count":7},{"name":"John Choi","email":"isnbh0@gmail.com","login":"isnbh0","count":6}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-01-18T00:00:11.381Z","repositories_count":6167940,"commits_count":932757053,"contributors_count":36250121,"owners_count":1138393,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues":{"table":{"full_name":"snarfed/granary","html_url":"https://github.com/snarfed/granary","last_synced_at":"2026-01-06T01:00:25.928Z","status":null,"issues_count":43,"pull_requests_count":649,"avg_time_to_close_issue":73739498.30434783,"avg_time_to_close_pull_request":166757.72756933115,"issues_closed_count":23,"pull_requests_closed_count":613,"pull_request_authors_count":8,"issue_authors_count":16,"avg_comments_per_issue":2.7209302325581395,"avg_comments_per_pull_request":0.48073959938366717,"merged_pull_requests_count":558,"bot_issues_count":2,"bot_pull_requests_count":622,"past_year_issues_count":5,"past_year_pull_requests_count":123,"past_year_avg_time_to_close_issue":66012.0,"past_year_avg_time_to_close_pull_request":322951.63636363635,"past_year_issues_closed_count":1,"past_year_pull_requests_closed_count":99,"past_year_pull_request_authors_count":3,"past_year_issue_authors_count":2,"past_year_avg_comments_per_issue":1.0,"past_year_avg_comments_per_pull_request":0.5609756097560976,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":114,"past_year_merged_pull_requests_count":88,"created_at":"2023-05-09T10:45:58.858Z","updated_at":"2026-01-06T01:00:25.929Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/snarfed%2Fgranary/issues","issue_labels_count":{"table":{"dependencies":2,"new source":2,"now":1,"python":1}},"pull_request_labels_count":{"table":{"dependencies":617,"python":129,"github_actions":9}},"issue_author_associations_count":{"table":{"NONE":19,"OWNER":17,"CONTRIBUTOR":6,"COLLABORATOR":1}},"pull_request_author_associations_count":{"table":{"CONTRIBUTOR":641,"NONE":7,"OWNER":1}},"issue_authors":{"table":{"snarfed":17,"gRegorLove":4,"sjehuda":4,"JoelOtter":3,"imax9000":2,"aaronpk":2,"dependabot[bot]":2,"ThisIsMissEm":1,"tomasparks":1,"skpy":1,"bdesham":1,"blackcoffeexbt":1,"strugee":1,"mikae1":1,"eadmaster":1,"jamietanna":1}},"pull_request_authors":{"table":{"dependabot[bot]":622,"JoelOtter":11,"Daft-Freak":8,"sarajaksa":3,"isnbh0":2,"vergenzt":1,"KDederichs":1,"snarfed":1}},"host":{"table":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-01-06T00:00:36.104Z","repositories_count":12642512,"issues_count":35809306,"pull_requests_count":117622899,"authors_count":11081511,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"}},"past_year_issue_labels_count":{"table":{}},"past_year_pull_request_labels_count":{"table":{"dependencies":110,"python":101,"github_actions":6}},"past_year_issue_author_associations_count":{"table":{"NONE":5}},"past_year_pull_request_author_associations_count":{"table":{"CONTRIBUTOR":121,"NONE":2}},"past_year_issue_authors":{"table":{"sjehuda":4,"gRegorLove":1}},"past_year_pull_request_authors":{"table":{"dependabot[bot]":114,"Daft-Freak":8,"KDederichs":1}},"maintainers":[{"table":{"login":"snarfed","count":18,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/snarfed"}},{"table":{"login":"jamietanna","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/jamietanna"}}],"active_maintainers":[]}},"events":{"total":{"CreateEvent":137,"ReleaseEvent":2,"IssuesEvent":12,"WatchEvent":54,"DeleteEvent":136,"IssueCommentEvent":121,"PushEvent":290,"PullRequestReviewEvent":29,"PullRequestReviewCommentEvent":25,"PullRequestEvent":315,"ForkEvent":8},"last_year":{"CreateEvent":88,"ReleaseEvent":1,"IssuesEvent":7,"WatchEvent":39,"DeleteEvent":88,"IssueCommentEvent":73,"PushEvent":205,"PullRequestReviewCommentEvent":7,"PullRequestReviewEvent":13,"PullRequestEvent":219,"ForkEvent":6}},"keywords":["activitypub","activitystreams","atom","atproto","bluesky","converter","fediverse","feed","html","indieweb","json","jsonfeed","mastodon","microformats2","rest-api","rss"],"dependencies":[{"ecosystem":"pypi","filepath":"docs/requirements.txt","sha":null,"kind":"manifest","created_at":"2022-07-12T05:18:30.503Z","updated_at":"2022-07-12T05:18:30.503Z","repository_link":"https://github.com/snarfed/granary/blob/main/docs/requirements.txt","dependencies":[{"id":153171412,"package_name":"sphinx","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":153171413,"package_name":"sphinx-rtd-theme","ecosystem":"pypi","requirements":"\u003e=1.0.0","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2022-07-12T05:18:30.760Z","updated_at":"2022-07-12T05:18:30.760Z","repository_link":"https://github.com/snarfed/granary/blob/main/requirements.txt","dependencies":[{"id":153173204,"package_name":"oauth_dropins","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":153173205,"package_name":"gdata","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":153173206,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"==4.11.1","direct":true,"kind":"runtime","optional":false},{"id":153173207,"package_name":"brevity","ecosystem":"pypi","requirements":"==0.2.17","direct":true,"kind":"runtime","optional":false},{"id":153173208,"package_name":"cachetools","ecosystem":"pypi","requirements":"==5.1.0","direct":true,"kind":"runtime","optional":false},{"id":153173209,"package_name":"certifi","ecosystem":"pypi","requirements":"==2022.6.15","direct":true,"kind":"runtime","optional":false},{"id":153173210,"package_name":"charset-normalizer","ecosystem":"pypi","requirements":"==2.0.12","direct":true,"kind":"runtime","optional":false},{"id":153173211,"package_name":"click","ecosystem":"pypi","requirements":"==8.1.3","direct":true,"kind":"runtime","optional":false},{"id":153173212,"package_name":"colorama","ecosystem":"pypi","requirements":"==0.4.5","direct":true,"kind":"runtime","optional":false},{"id":153173213,"package_name":"Deprecated","ecosystem":"pypi","requirements":"==1.2.13","direct":true,"kind":"runtime","optional":false},{"id":153173214,"package_name":"domain2idna","ecosystem":"pypi","requirements":"==1.12.0","direct":true,"kind":"runtime","optional":false},{"id":153173215,"package_name":"ecdsa","ecosystem":"pypi","requirements":"==0.17.0","direct":true,"kind":"runtime","optional":false},{"id":153173216,"package_name":"extras","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":153173217,"package_name":"feedgen","ecosystem":"pypi","requirements":"==0.9.0","direct":true,"kind":"runtime","optional":false},{"id":153173218,"package_name":"feedparser","ecosystem":"pypi","requirements":"==6.0.10","direct":true,"kind":"runtime","optional":false},{"id":153173219,"package_name":"fixtures","ecosystem":"pypi","requirements":"==4.0.1","direct":true,"kind":"runtime","optional":false},{"id":153173220,"package_name":"Flask","ecosystem":"pypi","requirements":"==2.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173221,"package_name":"Flask-Caching","ecosystem":"pypi","requirements":"==2.0.0","direct":true,"kind":"runtime","optional":false},{"id":153173222,"package_name":"flask-gae-static","ecosystem":"pypi","requirements":"==0.2","direct":true,"kind":"runtime","optional":false},{"id":153173223,"package_name":"gdata","ecosystem":"pypi","requirements":"==4.0.1","direct":true,"kind":"runtime","optional":false},{"id":153173224,"package_name":"google-api-core","ecosystem":"pypi","requirements":"==2.7.1","direct":true,"kind":"runtime","optional":false},{"id":153173225,"package_name":"google-auth","ecosystem":"pypi","requirements":"==2.6.3","direct":true,"kind":"runtime","optional":false},{"id":153173226,"package_name":"google-cloud-appengine-logging","ecosystem":"pypi","requirements":"==1.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173227,"package_name":"google-cloud-audit-log","ecosystem":"pypi","requirements":"==0.2.2","direct":true,"kind":"runtime","optional":false},{"id":153173228,"package_name":"google-cloud-core","ecosystem":"pypi","requirements":"==2.2.3","direct":true,"kind":"runtime","optional":false},{"id":153173229,"package_name":"google-cloud-datastore","ecosystem":"pypi","requirements":"==1.15.4","direct":true,"kind":"runtime","optional":false},{"id":153173230,"package_name":"google-cloud-logging","ecosystem":"pypi","requirements":"==3.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173231,"package_name":"google-cloud-ndb","ecosystem":"pypi","requirements":"==1.11.1","direct":true,"kind":"runtime","optional":false},{"id":153173232,"package_name":"googleapis-common-protos","ecosystem":"pypi","requirements":"==1.56.3","direct":true,"kind":"runtime","optional":false},{"id":153173233,"package_name":"grpc-google-iam-v1","ecosystem":"pypi","requirements":"==0.12.4","direct":true,"kind":"runtime","optional":false},{"id":153173234,"package_name":"grpcio","ecosystem":"pypi","requirements":"==1.47.0","direct":true,"kind":"runtime","optional":false},{"id":153173235,"package_name":"gunicorn","ecosystem":"pypi","requirements":"==20.1.0","direct":true,"kind":"runtime","optional":false},{"id":153173236,"package_name":"html2text","ecosystem":"pypi","requirements":"==2020.1.16","direct":true,"kind":"runtime","optional":false},{"id":153173237,"package_name":"html5lib","ecosystem":"pypi","requirements":"==1.1","direct":true,"kind":"runtime","optional":false},{"id":153173238,"package_name":"humanfriendly","ecosystem":"pypi","requirements":"==10.0","direct":true,"kind":"runtime","optional":false},{"id":153173239,"package_name":"humanize","ecosystem":"pypi","requirements":"==4.2.3","direct":true,"kind":"runtime","optional":false},{"id":153173240,"package_name":"idna","ecosystem":"pypi","requirements":"==3.3","direct":true,"kind":"runtime","optional":false},{"id":153173241,"package_name":"itsdangerous","ecosystem":"pypi","requirements":"==2.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173242,"package_name":"Jinja2","ecosystem":"pypi","requirements":"==3.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173243,"package_name":"lxml","ecosystem":"pypi","requirements":"==4.9.1","direct":true,"kind":"runtime","optional":false},{"id":153173244,"package_name":"MarkupSafe","ecosystem":"pypi","requirements":"==2.1.1","direct":true,"kind":"runtime","optional":false},{"id":153173245,"package_name":"mf2py","ecosystem":"pypi","requirements":"==1.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173246,"package_name":"mf2util","ecosystem":"pypi","requirements":"==0.5.1","direct":true,"kind":"runtime","optional":false},{"id":153173247,"package_name":"mox3","ecosystem":"pypi","requirements":"==1.1.0","direct":true,"kind":"runtime","optional":false},{"id":153173248,"package_name":"oauthlib","ecosystem":"pypi","requirements":"==3.2.0","direct":true,"kind":"runtime","optional":false},{"id":153173249,"package_name":"packaging","ecosystem":"pypi","requirements":"==21.3","direct":true,"kind":"runtime","optional":false},{"id":153173250,"package_name":"pbr","ecosystem":"pypi","requirements":"==5.9.0","direct":true,"kind":"runtime","optional":false},{"id":153173251,"package_name":"praw","ecosystem":"pypi","requirements":"==7.6.0","direct":true,"kind":"runtime","optional":false},{"id":153173252,"package_name":"prawcore","ecosystem":"pypi","requirements":"==2.3.0","direct":true,"kind":"runtime","optional":false},{"id":153173253,"package_name":"proto-plus","ecosystem":"pypi","requirements":"==1.20.6","direct":true,"kind":"runtime","optional":false},{"id":153173254,"package_name":"protobuf","ecosystem":"pypi","requirements":"==3.20.1","direct":true,"kind":"runtime","optional":false},{"id":153173255,"package_name":"pyasn1","ecosystem":"pypi","requirements":"==0.4.8","direct":true,"kind":"runtime","optional":false},{"id":153173256,"package_name":"pyasn1-modules","ecosystem":"pypi","requirements":"==0.2.8","direct":true,"kind":"runtime","optional":false},{"id":153173257,"package_name":"pymemcache","ecosystem":"pypi","requirements":"==3.5.2","direct":true,"kind":"runtime","optional":false},{"id":153173258,"package_name":"pyparsing","ecosystem":"pypi","requirements":"==3.0.9","direct":true,"kind":"runtime","optional":false},{"id":153173259,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"==2.8.2","direct":true,"kind":"runtime","optional":false},{"id":153173260,"package_name":"python-tumblpy","ecosystem":"pypi","requirements":"==1.1.4","direct":true,"kind":"runtime","optional":false},{"id":153173261,"package_name":"pytz","ecosystem":"pypi","requirements":"==2022.1","direct":true,"kind":"runtime","optional":false},{"id":153173262,"package_name":"PyYAML","ecosystem":"pypi","requirements":"==6.0","direct":true,"kind":"runtime","optional":false},{"id":153173263,"package_name":"redis","ecosystem":"pypi","requirements":"==4.3.4","direct":true,"kind":"runtime","optional":false},{"id":153173264,"package_name":"requests","ecosystem":"pypi","requirements":"==2.28.1","direct":true,"kind":"runtime","optional":false},{"id":153173265,"package_name":"requests-oauthlib","ecosystem":"pypi","requirements":"==1.3.1","direct":true,"kind":"runtime","optional":false},{"id":153173266,"package_name":"rsa","ecosystem":"pypi","requirements":"==4.8","direct":true,"kind":"runtime","optional":false},{"id":153173267,"package_name":"sgmllib3k","ecosystem":"pypi","requirements":"==1.0.0","direct":true,"kind":"runtime","optional":false},{"id":153173268,"package_name":"six","ecosystem":"pypi","requirements":"==1.16.0","direct":true,"kind":"runtime","optional":false},{"id":153173269,"package_name":"soupsieve","ecosystem":"pypi","requirements":"==2.3.2.post1","direct":true,"kind":"runtime","optional":false},{"id":153173270,"package_name":"testtools","ecosystem":"pypi","requirements":"==2.5.0","direct":true,"kind":"runtime","optional":false},{"id":153173271,"package_name":"tlslite-ng","ecosystem":"pypi","requirements":"==0.7.6","direct":true,"kind":"runtime","optional":false},{"id":153173272,"package_name":"tweepy","ecosystem":"pypi","requirements":"==4.10.0","direct":true,"kind":"runtime","optional":false},{"id":153173273,"package_name":"ujson","ecosystem":"pypi","requirements":"==5.4.0","direct":true,"kind":"runtime","optional":false},{"id":153173274,"package_name":"update-checker","ecosystem":"pypi","requirements":"==0.18.0","direct":true,"kind":"runtime","optional":false},{"id":153173275,"package_name":"urllib3","ecosystem":"pypi","requirements":"==1.26.10","direct":true,"kind":"runtime","optional":false},{"id":153173276,"package_name":"webapp2","ecosystem":"pypi","requirements":"==3.0.0b1","direct":true,"kind":"runtime","optional":false},{"id":153173277,"package_name":"webencodings","ecosystem":"pypi","requirements":"==0.5.1","direct":true,"kind":"runtime","optional":false},{"id":153173278,"package_name":"WebOb","ecosystem":"pypi","requirements":"==1.8.7","direct":true,"kind":"runtime","optional":false},{"id":153173279,"package_name":"websocket-client","ecosystem":"pypi","requirements":"==1.3.3","direct":true,"kind":"runtime","optional":false},{"id":153173280,"package_name":"Werkzeug","ecosystem":"pypi","requirements":"==2.1.2","direct":true,"kind":"runtime","optional":false},{"id":153173281,"package_name":"wrapt","ecosystem":"pypi","requirements":"==1.14.1","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"pypi","filepath":"setup.py","sha":null,"kind":"manifest","created_at":"2022-07-12T05:18:31.012Z","updated_at":"2022-07-12T05:18:31.012Z","repository_link":"https://github.com/snarfed/granary/blob/main/setup.py","dependencies":[{"id":153178078,"package_name":"beautifulsoup4","ecosystem":"pypi","requirements":"\u003e=4.8","direct":true,"kind":"runtime","optional":false},{"id":153178079,"package_name":"brevity","ecosystem":"pypi","requirements":"\u003e=0.2.17","direct":true,"kind":"runtime","optional":false},{"id":153178080,"package_name":"feedgen","ecosystem":"pypi","requirements":"\u003e=0.9","direct":true,"kind":"runtime","optional":false},{"id":153178081,"package_name":"feedparser","ecosystem":"pypi","requirements":"*","direct":true,"kind":"runtime","optional":false},{"id":153178082,"package_name":"html2text","ecosystem":"pypi","requirements":"\u003e=2019.8.11","direct":true,"kind":"runtime","optional":false},{"id":153178083,"package_name":"humanfriendly","ecosystem":"pypi","requirements":"\u003e=4.18","direct":true,"kind":"runtime","optional":false},{"id":153178084,"package_name":"jinja2","ecosystem":"pypi","requirements":"\u003e=2.10","direct":true,"kind":"runtime","optional":false},{"id":153178085,"package_name":"mf2util","ecosystem":"pypi","requirements":"\u003e=0.5.0","direct":true,"kind":"runtime","optional":false},{"id":153178086,"package_name":"oauth-dropins","ecosystem":"pypi","requirements":"\u003e=5.0","direct":true,"kind":"runtime","optional":false},{"id":153178087,"package_name":"praw","ecosystem":"pypi","requirements":"\u003e=7.3.0","direct":true,"kind":"runtime","optional":false},{"id":153178088,"package_name":"python-dateutil","ecosystem":"pypi","requirements":"\u003e=2.8","direct":true,"kind":"runtime","optional":false},{"id":153178089,"package_name":"requests","ecosystem":"pypi","requirements":"\u003e=2.22","direct":true,"kind":"runtime","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/auto-merge-dependabot.yaml","sha":null,"kind":"manifest","created_at":"2023-01-13T11:57:26.542Z","updated_at":"2023-01-13T11:57:26.542Z","repository_link":"https://github.com/snarfed/granary/blob/main/.github/workflows/auto-merge-dependabot.yaml","dependencies":[{"id":6875718716,"package_name":"dependabot/fetch-metadata","ecosystem":"actions","requirements":"v1.1.1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"actions","filepath":".github/workflows/codeql-analysis.yml","sha":null,"kind":"manifest","created_at":"2023-01-13T11:57:26.558Z","updated_at":"2023-01-13T11:57:26.558Z","repository_link":"https://github.com/snarfed/granary/blob/main/.github/workflows/codeql-analysis.yml","dependencies":[{"id":6875718717,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v2","direct":true,"kind":"composite","optional":false},{"id":6875718718,"package_name":"github/codeql-action/init","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":6875718719,"package_name":"github/codeql-action/autobuild","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":6875718720,"package_name":"github/codeql-action/analyze","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]}],"score":16.285873458286435,"created_at":"2023-04-05T14:05:15.702Z","updated_at":"2026-05-13T07:05:17.292Z","avatar_url":"https://github.com/snarfed.png","language":"Python","codemeta":null,"publiccode":null,"project_url":"https://summary.ecosyste.ms/api/v1/projects/1361","html_url":"https://summary.ecosyste.ms/projects/1361"}