{"id":23763808,"url":"https://github.com/tomashubelbauer/github-releases","last_synced_at":"2026-04-28T23:33:05.411Z","repository":{"id":107986126,"uuid":"239769895","full_name":"TomasHubelbauer/github-releases","owner":"TomasHubelbauer","description":"Monitors GitHub Releases of projects I star on GitHub and sends a single daily digest email","archived":false,"fork":false,"pushed_at":"2022-04-14T20:23:18.000Z","size":52,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-01T16:42:03.701Z","etag":null,"topics":["github","github-api","github-releases"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TomasHubelbauer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2020-02-11T13:35:03.000Z","updated_at":"2021-04-01T20:01:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"54f32638-9fb3-4f3d-b254-23f067ae6369","html_url":"https://github.com/TomasHubelbauer/github-releases","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/TomasHubelbauer/github-releases","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2Fgithub-releases","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2Fgithub-releases/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2Fgithub-releases/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2Fgithub-releases/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TomasHubelbauer","download_url":"https://codeload.github.com/TomasHubelbauer/github-releases/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TomasHubelbauer%2Fgithub-releases/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32404340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-28T19:38:08.556Z","status":"ssl_error","status_checked_at":"2026-04-28T19:37:55.688Z","response_time":56,"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":["github","github-api","github-releases"],"created_at":"2024-12-31T22:13:35.958Z","updated_at":"2026-04-28T23:33:05.404Z","avatar_url":"https://github.com/TomasHubelbauer.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GitHub Releases\n\nMonitors GitHub Releases of projects I star on GitHub and sends a single daily\ndigest email. A more humane alternative to Watch Releases, especially in cases\nwhere someone discovers GitHub Releases and decides to bulk-cut releases for\neach release of their project to date using the GitHub API, resulting in a\nbarrage of emails hitting your inbox.\n\n## Running\n\n`node . {token}`\n\n`token` should be provided through the command line argument or through the\n`GITHUB_TOKEN` environment variable. If not provided, public API rate limits\napply.\n\n## To-Do\n\n### Consider scraping my repos watched for releases off GitHub until API'd\n\n### Encode the email properly so that emoji shows up correctly\n\n### Convert shortcodes in the repository descriptions to emoji\n\n### Update the email copy to say the checked period\n\nThe range from the value of `stamp.utc` til now is the check range. In the\nemail body, say \"X releases across Y repositories since D\" where D is the date.\nSince it is virtually always going to be either daily or hourly, add relative\ntime formatting (yesterday at X, an hour ago, X hours ago, ...).\n\n### Parallelize the network calls\n\nSeveral of my other GitHub API based repositories already use this, so I can\nquickly adapt this: call the GitHub API for releases in bulks, where the\nnetwork calls are parallel and so is the processing, bringing the overall\nrun time down. This introduces a new parameter: the limit of maximal permitted\nconcurrency. For now set at 10 or something, or maybe elect to run a study like\none or two of my other repos do: set the level of parallelism at the current\nday of month number and store the times for each day number, in time revealing\nthe average sweep spot where the given level of concurrency provides the optimal\nspeed up.\n\nAlso it might be worth-while to pull out the bulking logic and use it as a\npackage in this and other repos where I've implemented the bulking. But it might\nbe too trivial to be worth it.\n\n### Consider limit-saving strategies\n\n**Pull all the repositories first and look at ones with known releases first**\n\nThis will maximize the opportunity to find new releases as repositories which\nalready have releases are more likely to have new ones than the ones that don't\nhave any releases yet.\n\n**Group the repositories into buckets and run different buckets on each run**\n\nMaybe group by the first name or something because as it stands this might blow\nall the way through even the authenticated rate limits and if not, eat up a\nsignificant chunk which chokes subsequent GitHub API users on the IP.\n\n**Have a batch size limit and process repositories in the oldest to newest**\n\nKeep the information about when was the last time a repo was checked. Scan the\nrepos on each run and pick a handful (configured by the maximum batch size) and\ndo those updating their stamps. On the next run, do another back based on the\ndates again. This will allow now using up all of the available rate limit (just\nthe configured bunch) freeing up the rest to other scripts. It could be run\nhourly and always use say max 50 % of the hour's rate.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomashubelbauer%2Fgithub-releases","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomashubelbauer%2Fgithub-releases","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomashubelbauer%2Fgithub-releases/lists"}