Start by treating your packages like code: build, version, and ship them from the same place you work. Pick your ecosystem—npm, Maven/Gradle, NuGet, RubyGems, or containers—and sign in with a token scoped for publishing. Add the registry settings to your project (for example, scope your npm org in .npmrc or add a repository entry in pom.xml). Then release exactly as you already do: npm publish, mvn deploy, dotnet nuget push, gem push, gradle publish, or docker push to ghcr.io. Use meaningful tags and semantic versions so teammates and automation can track changes. Link the package to a repository to surface README docs, license info, and releases alongside the artifact.
To install dependencies, point your tool to the same registry and use a read-only token. Restrict where installs can come from by scoping to your org and limiting visibility to the right teams. Set package permissions so only maintainers can push, while consumers get pull access. For JavaScript, keep private scopes in .npmrc; for .NET, prioritize your internal feed; for Java, declare the repository order; for containers, docker login once per host. Lock files and checksums keep builds reproducible, and you can audit versions through the repository’s package page to see who published what and when.
Automate releases with GitHub Actions. Trigger on tag creation, generate changelogs, bump versions from commit messages, run tests, and publish artifacts in a single workflow using GITHUB_TOKEN—no extra secrets required for most cases. For pre-releases, push canary builds from pull requests to a prerelease tag or separate channel, then promote the same commit to stable after approval. Use REST or GraphQL endpoints to query versions, clean up old builds, or kick off downstream jobs when a new version lands. Webhooks can notify chats, update docs, or fan out builds in other repos as soon as a package is available.
Operate at scale with consistent guardrails. Host libraries, containers, and tools next to source so access follows the same org and team permissions. Control visibility per package (internal or public) and set retention rules to prune stale versions. Track download counts and consumers to understand impact before deprecating a release. For containers on ghcr.io, rely on immutable digests, labels, and repository links to tie images back to commits. Global caching keeps installs fast for distributed teams, and co-locating code, issues, and artifacts simplifies reviews, incident response, and audits in one platform.
Free
Free
Storage: 500MB
Data transfer out within Actions: Unlimited
Data transfer out outside of Actions: 1GB per month
Same secure login for code and packages
Integrate packages with workflows
Reliable downloads via a global CDN
Simplify publishing
Trigger package installs
Pro
Custom
Storage: 2GB
Data transfer out within Actions: Unlimited
Data transfer out outside of Actions: 10GB per month
Additional storage: $0.25 per gigabyte
Additional data transfer out: $0.50 per gigabyte
Same secure login for code and packages
Integrate packages with workflows
Reliable downloads via a global CDN
Simplify publishing
Trigger package installs
Team
Custom
Storage: 2GB
Data transfer out within Actions: Unlimited
Data transfer out outside of Actions: 10GB per month
Additional storage: $0.25 per gigabyte
Additional data transfer out: $0.50 per gigabyte
Same secure login for code and packages
Integrate packages with workflows
Reliable downloads via a global CDN
Simplify publishing
Trigger package installs
Enterprise
Custom
Storage: 50GB
Data transfer out within Actions: Unlimited
Data transfer out outside of Actions: 100GB per month
Additional storage: $0.25 per gigabyte
Additional data transfer out: $0.50 per gigabyte
Same secure login for code and packages
Integrate packages with workflows
Reliable downloads via a global CDN
Simplify publishing
Trigger package installs
Comments