Private npm Registry
Host scoped and unscoped npm packages. Works with npm, Yarn, pnpm and Bun, at one price for your whole team.
Every feature on every plan, from $99/month billed annually.
14 days free. No credit card required.
Serving developers since 2016 Founder-run, no venture capital
//your-org.mycloudrepo.io/repositories/your-repo/:_authToken=${CLOUDREPO_TOKEN} npm publish --registry https://your-org.mycloudrepo.io/repositories/your-repo/ Included on every plan
Plans differ only in storage and transfer allowance.
- SSO (SAML, OIDC)
- Multi-factor authentication (MFA)
- Audit log
- Repository tokens
- Unlimited users, no per-seat pricing
- Human support
- Maven, npm, Python, Docker with Helm charts, and plain files
- Proxy repositories
- SCIM
Coming soon: Access log
What you get
A private npm registry for npm, Yarn, pnpm and Bun, with no server to run.
- Scoped AND Unscoped Packages Publish @company/lib or my-utils. Both work.
- Works with npm, Yarn, pnpm, and Bun Standard npm registry protocol. No vendor lock-in. Use whichever package manager your team prefers.
- Token-Based Auth Authenticate with a token in your `.npmrc` for CI/CD and local installs. Standard npm registry auth, no proprietary tooling required.
- Version Management dist-tags, deprecate and unpublish work with the npm commands you already use.
- Enterprise Access Control Per-user read/write permissions with organization-level isolation. Control who can publish and install.
Quick Setup Guide
Get your private npm registry running in minutes with standard npm tooling.
Connect npm to your registry
Send your scope's packages to your CloudRepo registry in ~/.npmrc; every other package still comes from the public npm registry. Replace @yourscope with your scope. Set NPM_TOKEN to a repository token: npm replaces ${NPM_TOKEN} with the environment variable of that name, so the file holds no token. Keep the trailing slash on both lines.
@yourscope:registry=https://your-org.mycloudrepo.io/repositories/your-repo/
//your-org.mycloudrepo.io/repositories/your-repo/:_authToken=${NPM_TOKEN} Prefer to sign in from your browser? Keep only the first line above and run this instead of the token line. npm writes the token to ~/.npmrc for you.
npm login --registry https://your-org.mycloudrepo.io/repositories/your-repo/ Check the connection
Name your repository, because step 1 sends only your scope there. npm whoami prints your email address, and npm ping ends with PONG.
npm whoami --registry https://your-org.mycloudrepo.io/repositories/your-repo/
npm ping --registry https://your-org.mycloudrepo.io/repositories/your-repo/ Publish your package
Run this in the directory of your package. The publish names your repository, so a package without your scope won't go to the public registry.
npm publish --registry https://your-org.mycloudrepo.io/repositories/your-repo/ Install from your registry
Install your scope's packages just like you would from npmjs.com. The scope line in step 1 sends them to CloudRepo, and every other package still comes from npmjs.com, because a hosted repository serves only what you published.
# Install a package of your scope
npm install @yourscope/package Works with Every JavaScript Package Manager
CloudRepo uses the standard npm registry protocol. Use whichever tool your team prefers.
The standard Node.js package manager. Configure globally or per-project with .npmrc. This sends your scope to CloudRepo; every other package still comes from npmjs.com. Set NPM_TOKEN to a repository token.
@yourscope:registry=https://your-org.mycloudrepo.io/repositories/your-repo/
//your-org.mycloudrepo.io/repositories/your-repo/:_authToken=${NPM_TOKEN}
Send your scope's packages to your CloudRepo registry in .yarnrc.yml; every other package still comes from the public npm registry. Replace yourscope with your scope, without the @. Set NPM_TOKEN to a repository token; the file names the variable and holds no token.
npmScopes:
yourscope:
npmRegistryServer: "https://your-org.mycloudrepo.io/repositories/your-repo/"
npmPublishRegistry: "https://your-org.mycloudrepo.io/repositories/your-repo/"
npmAuthToken: "${NPM_TOKEN}" Yarn 4.15 and later wait a day before installing a newly published version. On Yarn 4.17 and later, add this to your scope's block to install your own packages the day you publish them. On 4.15 or 4.16, update Yarn or install the next day.
npmScopes:
yourscope:
npmRegistryServer: "https://your-org.mycloudrepo.io/repositories/your-repo/"
npmPublishRegistry: "https://your-org.mycloudrepo.io/repositories/your-repo/"
npmAuthToken: "${NPM_TOKEN}"
npmMinimalAgeGate: 0 This lets Yarn install versions you published today from your own repository. Delete that line to keep Yarn's one-day delay.
Uses standard .npmrc configuration. This sends your scope
to CloudRepo; every other package still comes from npmjs.com. Set NPM_TOKEN to a repository token.
@yourscope:registry=https://your-org.mycloudrepo.io/repositories/your-repo/
//your-org.mycloudrepo.io/repositories/your-repo/:_authToken=${NPM_TOKEN}
Configure via bunfig.toml or standard .npmrc. Set NPM_TOKEN to a repository token.
[install.scopes]
"@yourscope" = { token = "$NPM_TOKEN", url = "https://your-org.mycloudrepo.io/repositories/your-repo/" } npm, Yarn, pnpm and Bun all speak the npm registry protocol, so they all work with CloudRepo. Setup for each is in the documentation.
Comparing registries? We put the numbers side by side in our Artifactory alternatives guide and our Sonatype Nexus alternative comparison.
Every plan includes human support and SSO. See pricing
Moving npm packages off Nexus?
Install the migration tool with one line. Run it with --dry-run first: a dry run lists what would move and
uploads nothing.
pipx install cloudrepo-migrate No pipx? In a virtual environment, run pip install cloudrepo-migrate.
Coming from Artifactory? Publish each package to CloudRepo with npm publish.
Ready to host your npm packages?
14 days free. No credit card required.
Founder-run since 2016, with no venture capital. A real person answers within one business day. Usually it's me.
Chris, founder of CloudRepo