{"id":14483429,"url":"https://github.com/ipitio/backage","last_synced_at":"2026-01-29T04:18:56.836Z","repository":{"id":243358848,"uuid":"812217288","full_name":"ipitio/backage","owner":"ipitio","description":"Endpoint behind badges for GitHub Packages","archived":false,"fork":false,"pushed_at":"2026-01-22T13:16:09.000Z","size":838001,"stargazers_count":48,"open_issues_count":1,"forks_count":14,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-01-22T16:59:09.066Z","etag":null,"topics":["api","automation","docker","ghcr","github-actions","gnu-parallel","gradle","json2xml","maven","monitoring","npm","nuget","proxy","rubygems","scraper","time-series","yq"],"latest_commit_sha":null,"homepage":"https://ipitio.github.io/backage/","language":"Shell","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/ipitio.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":"2024-06-08T09:11:40.000Z","updated_at":"2026-01-22T13:16:13.000Z","dependencies_parsed_at":"2024-06-08T10:28:01.637Z","dependency_job_id":"5e549f77-01a9-4bfa-bd8b-cf68afa2ce19","html_url":"https://github.com/ipitio/backage","commit_stats":{"total_commits":1536,"total_committers":11,"mean_commits":"139.63636363636363","dds":0.00846354166666663,"last_synced_commit":"164ff1f6089c2216053e0f8626b700f2c1978fba"},"previous_names":["ipitio/ghcr-pulls","ipitio/badges"],"tags_count":109,"template":false,"template_full_name":null,"purl":"pkg:github/ipitio/backage","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipitio%2Fbackage","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipitio%2Fbackage/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipitio%2Fbackage/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipitio%2Fbackage/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ipitio","download_url":"https://codeload.github.com/ipitio/backage/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ipitio%2Fbackage/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28862142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T22:56:21.783Z","status":"online","status_checked_at":"2026-01-29T02:00:06.714Z","response_time":59,"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":["api","automation","docker","ghcr","github-actions","gnu-parallel","gradle","json2xml","maven","monitoring","npm","nuget","proxy","rubygems","scraper","time-series","yq"],"created_at":"2024-09-03T00:01:46.006Z","updated_at":"2026-01-29T04:18:56.830Z","avatar_url":"https://github.com/ipitio.png","language":"Shell","readme":"\u003cdiv align=\"center\"\u003e\n\n[![logo](src/img/logo-b.webp)](https://github.com/ipitio/backage)\n\n# [backage](https://github.com/ipitio/backage)\n\n**It's all part and parcel**\n\n---\n\n[![packages](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2F.json\u0026query=%24.packages\u0026logo=github\u0026logoColor=959da5\u0026label=packages\u0026labelColor=333a41\u0026color=grey)](https://github.com/ipitio/backage/tree/index) [![updated](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2F.json\u0026query=%24.date\u0026logo=github\u0026logoColor=959da5\u0026label=updated\u0026labelColor=333a41\u0026color=indigo)](https://github.com/ipitio/backage/releases/latest)\n\n[![tag](https://img.shields.io/badge/dynamic/xml?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2Fipitio%2Fbackage%2Fbackage.xml\u0026query=%2Fxml%2Fversion%5B.%2Flatest%5B.%3D%22true%22%5D%5D%2Ftags%5B.!%3D%22latest%22%5D\u0026logo=github\u0026logoColor=959da5\u0026label=tag\u0026labelColor=333a41\u0026color=black)](https://github.com/ipitio/backage/pkgs/container/backage) [![build](https://github.com/ipitio/backage/actions/workflows/publish.yml/badge.svg)](https://github.com/ipitio/backage/pkgs/container/backage) [![size](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2Fipitio%2Fbackage%2Fbackage.json\u0026query=%24.size\u0026logo=github\u0026logoColor=959da5\u0026label=size\u0026labelColor=333a41\u0026color=sienna)](https://github.com/ipitio/backage/pkgs/container/backage) [![runs](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fgithub.com%2Fipitio%2Fbackage%2Fraw%2Findex%2Fipitio%2Fbackage%2Fbackage.json\u0026query=%24.downloads\u0026logo=github\u0026logoColor=959da5\u0026label=runs\u0026labelColor=333a41)](https://github.com/ipitio/backage/pkgs/container/backage)\n\n\u003c/div\u003e\n\nEver wish you could show npm, gem, mvn, Gradle, NuGet, or GHCR badges for GitHub Packages? Or just query for the download counts? This endpoint makes that possible, using only free GitHub resources; the API doesn't, and has never, exposed the public metadata that other registries provide.\n\n## Getting Started\n\nIf this is [`ipitio/backage`](https://github.com/ipitio/backage), all you have to do is **star the repo to get your public packages added!** The service's circular priority queue will update the [closed-loop system](https://github.com/ipitio/backage/releases/latest) with them within the next few hours. Additionally watching and forking the repo, and following the owner, are ways to increase their priority. Yes, I know, but these are the graphs GitHub has available.\n\n\u003e [!WARNING]\n\u003e Ensure your profile is [public](https://github.com/ipitio/backage/issues/34#issuecomment-2968850773) so that this repo can see your packages.\n\nOtherwise, if this is a fork, you'd prefer an alternative method, or your packages weren't added to the [index](https://github.com/ipitio/backage/tree/index) after a day, enter the case-sensitive name of each missing user or organization on a new line at the top of the queue, `owners.txt`, [here](https://github.com/ipitio/backage/edit/master/owners.txt) and make a pull request. Don't worry -- while my Contribution Graph is an uptime monitor of sorts, yours won't be. See the top of `bkg.sh` for details about available options, which must come last when passed to `update.sh`, as shown in `Self-Host` below.\n\n\u003e [!TIP]\n\u003e You only need to add names to the queue; IDs are fetched as needed and entries are removed once processed.\n\nNew packages won't be added until *all* existing ones are refreshed; you should also create an independent instance that'll update faster and more frequently. Simply fork just the `master` branch, choose one of the following options, and use the [Alternative URL](#alternative-url) when it changes. This centralized repo will then serve as a backup for all subsets of packages not in `optout.txt`.\n\n\u003e [!IMPORTANT]\n\u003e Your own packages will be picked up automatically! If you need to edit `owners.txt`, do so after the first run.\n\n\u003cdetails\u003e\n\u003csummary\u003eWith Actions\u003c/summary\u003e\n\nThis will use a lot of minutes on GitHub-hosted runners, so you may want to use your own.\n\n1. Enable Actions from its tab\n2. Enable all disabled workflows\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eSelf-Host\u003c/summary\u003e\n\nThis is an example for `systemd`; adapt it to your needs. Please note:\n\n- Docker needs to be installed\n- You don't need to set `GITHUB_TOKEN` if you first log in with `gh`\n- `-m 0` ensures only the public packages of the owners you've added are updated (default)\n  - You'll need the proper permissions to update private packages\n- `-d 0` allows everything to be updated in one go\n  - A graceful restart is initiated every 4 hours by default\n\n```bash\necho \"[Unit]\nDescription=Run Backage\nAfter=network.target\nStartLimitIntervalSec=0\n\n[Service]\nType=simple\nRestart=always\nRestartSec=5\nExecStart=/usr/bin/sh -c '                   \\\\\n  GITHUB_TOKEN=\u003cPAT\u003e                        ;\\\\\n  GITHUB_OWNER=\u003cusername\u003e                   ;\\\\\n  GITHUB_REPO=backage                       ;\\\\\n  GITHUB_BRANCH=master                      ;\\\\\n  BKG_PATH=\\$GITHUB_REPO/\\$GITHUB_BRANCH    ;\\\\\n  mkdir -p /opt/\\$BKG_PATH                  ;\\\\\n  docker run -v /opt/\\$BKG_PATH:/app         \\\\\n    --env-file \u003c(env | grep GITHUB)          \\\\\n    ghcr.io/\\$GITHUB_OWNER/\\${BKG_PATH////:} \\\\\n    src/test/update.sh -m 0 -d 0'\n\n[Install]\nWantedBy=multi-user.target\n\" | sudo tee /etc/systemd/system/bkg.service\nsudo systemctl daemon-reload\nsudo systemctl enable --now bkg\n```\n\n\u003c/details\u003e\n\n## The Endpoint\n\n```py\nhttps://ipitio.github.io/backage/OWNER/[REPO/[PACKAGE]].FORMAT\n```\n\nOnce the packages you're interested in have been added, replace the parameters with their respective values, scoping to your parsing needs, then access the latest data however you want. The format can be either `json` or `xml`.\n\n\u003e [!NOTE]\n\u003e Use something like [shields.io/json](https://shields.io/badges/dynamic-json-badge) or [shields.io/xml](https://shields.io/badges/dynamic-xml-badge) to make badges like [this one](https://github.com/badges/shields/issues/5594#issuecomment-2157626147). You'll need the latter to evaluate expressions, like filters ([issue](https://github.com/ipitio/backage/issues/23)).\n\n### Available Properties\n\n\u003cdetails\u003e\n\n\u003csummary\u003ePackage\u003c/summary\u003e\n\n|       Property        |     Type     | Description                                             |\n| :-------------------: | :----------: | ------------------------------------------------------- |\n|      `owner_id`       |    number    | The ID of the owner                                     |\n|     `owner_type`      |    string    | The type of owner (e.g. `users`)                        |\n|    `package_type`     |    string    | The type of package (e.g. `container`)                  |\n|        `owner`        |    string    | The owner of the package                                |\n|        `repo`         |    string    | The repository of the package                           |\n|       `package`       |    string    | The package name                                        |\n|        `date`         |    string    | The most recent date the package was refreshed          |\n|        `size`         |    string    | Formatted size of the latest version                    |\n|      `versions`       |    string    | Formatted count of all versions recently tracked        |\n|       `tagged`        |    string    | Formatted count of all tagged versions recently tracked |\n|     `owner_rank`      |    string    | Formatted rank by downloads within the owner            |\n|      `repo_rank`      |    string    | Formatted rank by downloads within the repository       |\n|      `downloads`      |    string    | Formatted count of all downloads                        |\n|   `downloads_month`   |    string    | Formatted count of all downloads in the last month      |\n|   `downloads_week`    |    string    | Formatted count of all downloads in the last week       |\n|    `downloads_day`    |    string    | Formatted count of all downloads in the last day        |\n|      `raw_size`       |    number    | Size of the latest version, in bytes                    |\n|    `raw_versions`     |    number    | Count of versions ever tracked                          |\n|     `raw_tagged`      |    number    | Count of tagged versions ever tracked                   |\n|   `raw_owner_rank`    |    number    | Rank by downloads within the owner                      |\n|    `raw_repo_rank`    |    number    | Rank by downloads within the repository                 |\n|    `raw_downloads`    |    number    | Count of all downloads                                  |\n| `raw_downloads_month` |    number    | Count of all downloads in the last month                |\n| `raw_downloads_week`  |    number    | Count of all downloads in the last week                 |\n|  `raw_downloads_day`  |    number    | Count of all downloads in the last day                  |\n|       `version`       | object array | The versions of the package (see below)                 |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eVersion\u003c/summary\u003e\n\n|       Property        |     Type     | Description                                    |\n| :-------------------: | :----------: | ---------------------------------------------- |\n|         `id`          |    number    | The ID of the version                          |\n|        `name`         |    string    | The version name                               |\n|        `date`         |    string    | The most recent date the version was refreshed |\n|       `newest`        |   boolean    | Whether the version is the newest              |\n|       `latest`        |   boolean    | Whether the version is the newest tagged       |\n|        `size`         |    string    | Formatted size of the version                  |\n|      `downloads`      |    string    | Formatted count of downloads                   |\n|   `downloads_month`   |    string    | Formatted count of downloads in the last month |\n|   `downloads_week`    |    string    | Formatted count of downloads in the last week  |\n|    `downloads_day`    |    string    | Formatted number of downloads in the last day  |\n|      `raw_size`       |    number    | Size of the version, in bytes                  |\n|    `raw_downloads`    |    number    | Count of downloads                             |\n| `raw_downloads_month` |    number    | Count of downloads in the last month           |\n| `raw_downloads_week`  |    number    | Count of downloads in the last week            |\n|  `raw_downloads_day`  |    number    | Count of downloads in the last day             |\n|        `tags`         | string array | The tags of the version                        |\n\n\u003c/details\u003e\n\n### Query Syntax\n\n\u003cdetails\u003e\n\n\u003csummary\u003eJSON\u003c/summary\u003e\n\nYou can query a package for its properties, like size or version:\n\n```js\n$.PROPERTY\n```\n\n```js\n$.size\n```\n\nVersions may be filtered in and tags out:\n\n```js\n$.version[FILTER].PROPERTY\n```\n\n```js\n$.version[?(@.latest)].tags[?(@!=\"latest\")]\n```\n\nAs can packages in `owner[/repo]/.json` files:\n\n```js\n$.[FILTER].PROPERTY\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\n\u003csummary\u003eXML\u003c/summary\u003e\n\nYou can query a package for its properties, like size or version:\n\n```py\n//PROPERTY\n```\n\n```py\n//size\n```\n\nVersions can be filtered in and tags out:\n\n```py\n//version[FILTER]/PROPERTY\n```\n\n```py\n//version[./latest[.=\"true\"]]/tags[.!=\"latest\"]\n```\n\nAs can packages in `owner[/repo]/.xml` files:\n\n```py\n//package[FILTER]/PROPERTY\n```\n\n\u003c/details\u003e\n\n### Alternative URL\n\n```py\nhttps://github.com/ipitio/backage/raw/index/OWNER/[REPO/[PACKAGE]].FORMAT\n```\n\nThe endpoint is also available here! This will change to your fork once it updates.\n\n## Bring Your Own JSON\n\n```py\nhttps://ipitio.github.io/backage?json=https://URL/ENCODED/JSON\n```\n\nWhile this doesn't directly work with Shields, you can BYOJ to convert into XML.  Try it out in your browser:\n\n**\u003chttps://ipitio.github.io/backage?json=https://raw.githubusercontent.com/ipitio/backage/index/.json\u003e**\n","funding_links":[],"categories":["Shell"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipitio%2Fbackage","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fipitio%2Fbackage","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fipitio%2Fbackage/lists"}