{"id":18048791,"url":"https://github.com/marcelgarus/shrinkgrow","last_synced_at":"2026-02-15T23:32:53.130Z","repository":{"id":96407129,"uuid":"370407996","full_name":"MarcelGarus/shrinkgrow","owner":"MarcelGarus","description":"A new versioning format","archived":false,"fork":false,"pushed_at":"2021-05-24T15:58:13.000Z","size":1,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-10-10T05:12:11.558Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"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/MarcelGarus.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}},"created_at":"2021-05-24T15:55:54.000Z","updated_at":"2021-05-24T15:58:15.000Z","dependencies_parsed_at":"2023-03-07T08:15:45.781Z","dependency_job_id":null,"html_url":"https://github.com/MarcelGarus/shrinkgrow","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MarcelGarus/shrinkgrow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcelGarus%2Fshrinkgrow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcelGarus%2Fshrinkgrow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcelGarus%2Fshrinkgrow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcelGarus%2Fshrinkgrow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarcelGarus","download_url":"https://codeload.github.com/MarcelGarus/shrinkgrow/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarcelGarus%2Fshrinkgrow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29492586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T19:29:10.908Z","status":"ssl_error","status_checked_at":"2026-02-15T19:29:10.419Z","response_time":118,"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"}},"keywords":[],"created_at":"2024-10-30T20:15:24.032Z","updated_at":"2026-02-15T23:32:53.107Z","avatar_url":"https://github.com/MarcelGarus.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shrink.Grow Versioning\n\n## Summary\n\n\u003c!-- TODO: Make interactive. --\u003e\n\nGiven a version number `shrink.grow`, increment the:\n\n* `shrink` version if you shrink the API surface\n* `grow` version if you grow the API surface\n\nAdditionally, you can add labels for pre-releases and build metadata.\n\n## Introduction\n\nWhen developing software with many dependencies, you need a system to manage changes to those dependencies.\nMore specifically, you want to keep coupling low: If someone else makes a backwards-compatible change to their code, you should automatically be able to use that.\nTo be able to automate that dependency upgrade, you need a way to define whether new versions are compatible with the old one or not.\n\nA good way to do that is by looking at the API surface of the dependency: If new methods or optional parameters got added, you can use the version.\nIf existing method signatures are not supported anymore, or some items got removed, you can't use the package without possibly having to upgrade your code.\n\nThe canonical solution to this problem is to use [Semantic Versioning](https://semver.org).\n\n### What are problems of SemVer?\n\n* Whether something is a minor version bump or a patch is sometimes subjective and it *doesn't even matter* when upgrading.  \n  With Shrink.Grow Versioning, there are only two numbers, so there's no wiggle room.\n* Software is never finished, so many packages are stuck with a 0.x.y version: [0ver.org](https://0ver.org/)  \n  This problem occurs, because the version is not simply treated as a machine-readable number useful for automatically updating dependencies and determining compatibility, but *also* for semantic information like \"Is this production ready?\"\n  With Shrink.Grow versioning, these information need to be delivered out-of-band, for example, using a package manager.\n\n## Shortcuts\n\nYou can use `shrink` as a shortcut for `shrink.0`.\nFor example, the version `2` is the same as `2.0`.\n\n## Pre-releases\n\nOptionally, the numbers can be followed by a `-` followed by a dot-separated list of either numbers or strings.\nThey are considered to be a smaller version than only the numbered version itself.\nThey are compared using standard number or string comparison, respectively.\n\nA handy property of the tags `alpha`, `beta`, `dogfood`, `fishfood`, `rc` (release candidate) is that they sort well alphabetically:\n\n```\n0.1 \u003c 1.0-alpha \u003c 1.0-alpha.1 \u003c 1.0-alpha.2 \u003c 1.0-beta \u003c 1.0-dogfood \u003c 1.0-fishfood \u003c 1.0-rc \u003c 1.0\n```\n\n## Build metadata\n\nOptionally, the numbers (and pre-release information) can be followed by a `+` and a build number.\nIf the number and pre-release is the same, the build number is used for comparison:\n\n```\n0.1-alpha+1 \u003c 0.1-alpha+2 \u003c 0.1\n```\n\n## Ranges\n\nIn some contexts, ranges of versions may be required.\n\nYou can write explicit version ranges using `\u003e=version \u003cother-version`.\nFor example, write `\u003e=1.0 \u003c3.0`.\n\nIf by context, it's clear that a version range is expected, you can also simply write one version as a shortcut for the range of the version up to the next `shrink` version bump.\nFor example, `1.2` is the same as `\u003e=1.2 \u003c2.0` and `3` is the same as `\u003e=3.0 \u003c4.0`.\n\nIn a context where a range is expected, you can also write `=version` to fix the dependency to one specific version.\n\n## Examples\n\n```\n2.3, 2.1-alpha.2, 49.7-beta.3\n```\n\n## Specification\n\nIn the following rules, `version` refers to either:\n\n* A version of the form `shrink.grow`\n* A version of the form `shrink`, refering to `shrink.0`\n\nThe rules:\n\n* `\u003e=version \u003cversion2` means any version between `version`, inclusive, and `version2`, exclusive\n* `version` means any version between `version` and the next shrink version\n* `=version` means exactly the `version`\n\n## Backus-Naur Form Grammar\n\n## Emergent behavior\n\n## FAQ\n\n### Why use numbered versioning at all?\n\nNumbered versioning is useful for automatically upgrading dependencies.\n\n## About\n\n## License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelgarus%2Fshrinkgrow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcelgarus%2Fshrinkgrow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcelgarus%2Fshrinkgrow/lists"}