Safeguard
Supply Chain•

Who can publish your package? Owner roles on npm, PyPI and crates.io

Compare what package owners and maintainers can do on npm, PyPI and crates.io, and how to review and trim the list of people who can ship your releases.

Safeguard Security Team
3 min read

On all three registries, anyone with publish rights can ship code under your package name, so the owner list is part of your attack surface. npm gives all owners the same power, PyPI splits Owner and Maintainer, and crates.io distinguishes user owners from team owners. Review the list on a schedule.

npm: all or nothing

npm owner ls <package> lists the users who can modify the package and publish new versions. npm owner add gives a user rights to edit metadata, publish and add other owners. npm owner rm ends access immediately. The docs say finer grained permissions are not implemented, so every owner can do everything. If your account uses two-factor authentication for auth-and-writes, owner changes ask for a second factor or the --otp flag.

PyPI: Owner and Maintainer

PyPI's help page defines two roles. A Maintainer can upload releases but cannot add collaborators or delete files, releases or the project. An Owner can do all of that. Only owners can add people, and PyPI may ask for a password confirmation because adding or removing collaborators is sensitive.

That split is useful. Give most contributors Maintainer, keep Owner for one or two people, and consider a trusted publisher so humans do not hold upload credentials at all. See npm and PyPI trusted publishing compared.

crates.io: users and teams

Cargo's reference says named user owners have full rights, including adding or removing owners. Team owners, written as github:org:team, can publish and yank but cannot change the owner list. Adding a team requires you to be a member, and team access needs the read:org GitHub scope, which may need organization approval. Manage owners with cargo owner --add and --remove.

Teams are convenient but inherit the team's membership. If someone joins the GitHub team for unrelated reasons, they gain publish rights.

A quarterly review

  1. List owners on every package you publish.
  2. Remove anyone who has left or no longer ships releases.
  3. Confirm each remaining person has strong two-factor authentication. See maintainer 2FA methods ranked.
  4. Look for dormant accounts, since an abandoned account is an easy takeover target.
  5. Record the review date.

If you are handing a project over, add the new owner first, confirm they can publish, then remove yourself and old tokens. Never share one login between people.

Safeguard flags maintainer and dependency risk signals on what you consume, which helps you apply this same discipline to others' packages.

Quick check

Can a PyPI Maintainer add another collaborator?

No. Only Owners can add collaborators, according to PyPI's help page.

Can a crates.io team owner remove other owners?

No. Team owners can publish and yank, but cannot add or remove owners.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.