uv works with any package index that implements the Python Simple Repository API, so you have plenty of options for hosting private packages. This page compares seven of them against the same three criteria:

  • Python standards that affect how uv resolves and installs packages
  • Authentication: how uv logs in and how long credentials last
  • Pricing model

The registries are listed alphabetically. “No” means the vendor doesn’t document support for the feature. Checked November 2026.

What the standards mean for uv

StandardWhat it does for uv
PEP 503 / PEP 691The HTML and JSON index pages uv reads to find files. Every index on this list serves PEP 503.
PEP 658 / PEP 714Lets uv read a wheel’s dependencies from a small metadata file instead of downloading the wheel. Resolution is faster, especially with large wheels.
PEP 592Yanked releases are skipped during resolution unless pinned exactly.
PEP 792Marks a project as archived or deprecated so installers can tell users.

Summary

RegistryPEP 503PEP 691PEP 658/714PEP 592PEP 792uv credentialCredential lifetimePricing model
AWS CodeArtifactYesYesNoUpstream PyPI packages onlyNoAuthorization token15 minutes to 12 hoursPer GB stored + per request
Azure ArtifactsYesNoNoNoNoPersonal access tokenUp to 1 yearPer GiB stored, 2 GiB free
CloudsmithYesNoYesNoNoAPI key or entitlement tokenNo fixed expiry (OIDC: 2 hours)Storage + delivery, free tier
GitLabYesYes (19.6; flag from 18.10)NoNoNoPersonal, deploy or CI job tokenPAT up to 1 year; job token for the jobPer seat, free tier
Google Artifact RegistryYesNoNoNoNoOAuth access token or service account key1 hour (key: no expiry)Per GB stored + egress
JFrog ArtifactoryYesYesOpt-inYesNoAccess tokenConfigurablePlan + consumption
RepoForge.ioYesYesYesYesYesAccess tokenUntil revokedPer user

AWS CodeArtifact

  • Standards: implements the Simple API per PEP 503, 691 and 700 (HTML and JSON), though only per-project pages exist, not the root /simple/ list. No PEP 658 metadata files. The yanked field is passed through for packages cached from PyPI, but you can’t yank packages you publish yourself. No PEP 792.
  • Authentication: username aws and a token from aws codeartifact get-authorization-token as the password, via UV_INDEX_<NAME>_USERNAME / UV_INDEX_<NAME>_PASSWORD, or keyring with the keyrings.codeartifact plugin to refresh it automatically. Tokens last 12 hours by default, configurable from 15 minutes to 12 hours, so CI and developer machines have to keep fetching new ones.
  • Pricing: pay as you go, no seats: $0.05/GB-month storage and $0.05 per 10,000 requests (us-east-1), plus standard AWS data transfer out. Small monthly free tier.

Azure Artifacts

  • Standards: feeds serve a PEP 503 HTML index only; uv’s maintainers have asked Azure to add PEP 691/700. No metadata files, yanking or project status.
  • Authentication: a personal access token (or $(System.AccessToken) in Pipelines) as the password with any username, or keyring with artifacts-keyring for Entra login. PATs last up to a year, and Microsoft now recommends Entra tokens instead.
  • Pricing: per organisation, no seats. First 2 GiB free, then $2/GiB up to 10 GiB, $1/GiB to 100 GiB, $0.50/GiB to 1,000 GiB and $0.25/GiB beyond.

Cloudsmith

  • Standards: PEP 503 HTML index. PEP 658 metadata files rolled out from May 2026, with uv named as a supported client. No JSON index, yanking or project status.
  • Authentication: username token with a user API key or entitlement token as the password. These don’t have a fixed expiry and can be rotated. OIDC tokens for CI last 2 hours.
  • Pricing: usage-based on storage and delivery bandwidth, no seats. Free tier with about 500 MB storage; Pro from about $149/month.

GitLab

  • Standards: PEP 503 HTML index per project or group. The PEP 691 JSON index arrived behind a feature flag in 18.10 and is generally available from 19.6. No metadata files, yanking or project status.
  • Authentication: uv has no GitLab guide, so use UV_INDEX_<NAME>_USERNAME / PASSWORD with a personal access token (read_api), a deploy token (read_package_registry) or, in CI, gitlab-ci-token and $CI_JOB_TOKEN. PATs last up to 365 days; deploy tokens don’t expire by default; job tokens only last for the job.
  • Pricing: per seat, from about $29/user/month for Premium. The package registry is on the free tier too.

Google Artifact Registry

  • Standards: PEP 503 HTML index. No JSON index; no PEP 658 metadata files (an open request on Google’s tracker). No yanking or project status.
  • Authentication: username oauth2accesstoken with gcloud auth application-default print-access-token as the password, or keyring with keyrings.google-artifactregistry-auth. Access tokens last one hour. A base64-encoded service account key (username _json_key_base64) doesn’t expire, but Google calls it the least secure option.
  • Pricing: $0.10/GB-month storage after 0.5 GB free, plus network egress. No seats.

JFrog Artifactory

  • Standards: PEP 503 HTML and PEP 691 JSON indexes, PEP 592 yanking. PEP 658 metadata files are behind a system property that is off by default; on SaaS you ask JFrog support to turn it on. No PEP 792.
  • Authentication: an access token as the password with an empty username. For uv publish, pass -u "" -p $TOKEN rather than --token. Token lifetime is configurable by the administrator.
  • Pricing: plan plus consumption (storage and transfer combined). Pro from $150/month with 25 GB included.

RepoForge.io

  • Standards: the index follows PEP 503 and PEP 691 (HTML and JSON), serves PEP 658/714 metadata files, supports PEP 592 yanking and PEP 792 project status, and checks Requires-Python. The full list is in the docs.
  • Authentication: an access token in the index URL with __token__ as the username, for example UV_INDEX_URL=https://__token__:<token>@api.repoforge.io/<your-hash-id>/. Tokens last until you revoke them, and every paid plan includes unlimited tokens. See How to install private Python packages with uv.
  • Pricing: per user per month, from £10/user/month billed yearly. Storage depends on the plan, and bandwidth isn’t metered. There’s a free plan for public packages. See pricing.

Choosing one

If your infrastructure already lives in AWS, Google Cloud, Azure or GitLab, their registries keep billing and access control in one place, at the cost of short-lived credentials (CodeArtifact, Google) or missing newer index standards. If standards support and long-lived tokens matter more, compare the per-user and usage-based prices above against your team size and storage.