Skip to main content

A fast, reliable, and scalable PyPI server

Project description

PypIron logo PypIron

CI PyPI License: MIT

An ultra-fast PyPI server written in Rust.

Highlights

  • 🚀 Ultra-fast — a $12/month server answers ~75,000 requests per second.
  • ♾️ Infinite horizontal scaling that "just works" — point any number of nodes at the same bucket; reads need zero coordination.
  • 📊 Per-project download tracking — tag requests by consuming project, straight into Prometheus.
  • 🔁 Mirror or proxy PyPI — one URL serves private packages and cached public dependencies, with PyPI's true upload times.
  • 🗄️ No database — truth is files, views are regenerable, backups are rsync.
  • 📦 Standards-complete — PEP 503, 691, 700, 658, 592; uv, pip, twine, poetry, and pdm work unmodified.
  • 🛡️ Dependency-confusion defense — every package is exclusively private or mirrored, claimed at first write.
  • 🩹 Self-healing — crash-safe event markers plus a daily storage audit; pypiron resync rebuilds the world.

Performance

Measured on real AWS hardware with the S3 backend (method and logs):

2 CPUs EC2 8 CPU EC2
Requests per second ~75,000 ~440,000
Request latency p99 2 ms p99 5 ms
Publish → installable 0.7 s 1 s with 10,000 packages hosted
900 MB wheel upload 15–20 s, ~50 MB memory 8 simultaneous, reads stay fast
Download throughput 3.9 Gbit/s* 48 Gbit/s*

* Saturated

Installation

uvx pypiron        # or: pip install pypiron
docker run --rm -it -p 8080:8080 -v pypiron-data:/data \
  -e PYPIRON_ADMIN_USER=admin -e PYPIRON_ADMIN_PASS=secret \
  ghcr.io/brycedrennan/pypiron:latest

Multi-arch (amd64/arm64) images are published to GHCR on every release tag (:X.Y.Z, :X.Y, :latest) and on each push to master (:master).

Documentation

Features

Publish and install

PYPIRON_ADMIN_USER=admin PYPIRON_ADMIN_PASS=secret uvx pypiron

uv publish --publish-url http://localhost:8080/legacy/ \
  --username admin --password secret dist/*.whl

pip install --index-url http://localhost:8080/simple/ mypackage

twine, poetry, and pdm work the same way. Point clients at this registry only — never --extra-index-url (see the FAQ).

Mirror PyPI

pypiron sync mirrors an allowlist of public packages, carrying PyPI's true upload timestamps so uv --exclude-newer resolves historically correct versions against your mirror:

pypiron sync --packages-list packages.txt \
  --to http://localhost:8080 --username admin --password adminsecret
# packages.txt
requests>=2.20,<3
numpy

Wheel/platform/date filters and a pypiron.toml config file are in CONFIGURATION.md.

Proxy PyPI on demand

sync mirrors what you list; the proxy mirrors what you use — fetched from upstream on first request, cached in storage forever after, served locally whether upstream is up or down:

pypiron --admin-user admin --admin-pass secret \
  --private-prefix acme \
  --proxy-upstream https://pypi.org

Names claimed private never fall through to upstream — the dependency-confusion hole stays closed.

Scale out

Start more nodes on the same bucket. That's the whole procedure:

pypiron --storage s3 --s3-bucket my-bucket ...   # node 1
pypiron --storage s3 --s3-bucket my-bucket ...   # node 2, same bucket, done

Reads are stateless file serving — no coordination, no shared state, no session affinity. Nodes elect an index writer through an S3 lease; failover is automatic.

Authentication

Three optional basic-auth credentials: admin (everything), uploader (publish), reader (read). No write credential configured means the server is read-only; no read credential means reads are public.

pip install --index-url http://reader:secret@localhost:8080/simple/ mypackage

Track downloads per project

Username subaddressing tags every request with the consuming project — counts land in Prometheus /metrics as pypiron_project_requests_total{project=...}:

export UV_INDEX_COMPANY_USERNAME="reader+billing-api"
export UV_INDEX_COMPANY_PASSWORD="secret"

FAQ

Does it really not need a database? No. Truth is files, the index is a regenerable view, backups are rsync. See DESIGN.md.

Why --index-url only, never --extra-index-url? pip merges extra indexes with no priority — that is the dependency-confusion vulnerability. Point clients at this registry only; it decides what exists.

Is one node enough? Almost always. Artifacts are served immutable and indexes ETag-revalidate, so client and proxy caches compound a single node's already-large capacity. Add nodes for availability, not throughput.

Is it production-ready? For private registries — the stated target — yes: one binary, measured numbers, and a blackbox suite that drives real clients. For a multi-tenant pypi.org clone, no, and we don't try.

Ecosystem

Alternatives, for comparison: devpi-server, pypiserver, pypicloud, warehouse.

License

PypIron is licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pypiron-0.0.3.tar.gz (1.8 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

pypiron-0.0.3-py3-none-win_arm64.whl (6.5 MB view details)

Uploaded Python 3Windows ARM64

pypiron-0.0.3-py3-none-win_amd64.whl (6.9 MB view details)

Uploaded Python 3Windows x86-64

pypiron-0.0.3-py3-none-win32.whl (6.0 MB view details)

Uploaded Python 3Windows x86

pypiron-0.0.3-py3-none-musllinux_1_2_x86_64.whl (7.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

pypiron-0.0.3-py3-none-musllinux_1_2_i686.whl (6.7 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

pypiron-0.0.3-py3-none-musllinux_1_2_armv7l.whl (6.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

pypiron-0.0.3-py3-none-musllinux_1_2_aarch64.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

pypiron-0.0.3-py3-none-manylinux_2_31_riscv64.whl (6.7 MB view details)

Uploaded Python 3manylinux: glibc 2.31+ riscv64

pypiron-0.0.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (6.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

pypiron-0.0.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

pypiron-0.0.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (7.2 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

pypiron-0.0.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (7.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

pypiron-0.0.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

pypiron-0.0.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (6.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

pypiron-0.0.3-py3-none-macosx_11_0_arm64.whl (6.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

pypiron-0.0.3-py3-none-macosx_10_12_x86_64.whl (6.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file pypiron-0.0.3.tar.gz.

File metadata

  • Download URL: pypiron-0.0.3.tar.gz
  • Upload date:
  • Size: 1.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pypiron-0.0.3.tar.gz
Algorithm Hash digest
SHA256 2c64b8800400c8d71be1d43340ca124cd5e05af76b51b1a9675893312bab90bb
MD5 b688d4dc1265c911fff73b4c82751d5a
BLAKE2b-256 e04244876e52a684bf812520193fb0632cbccb3b8765fe62cb034b34cabac510

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3.tar.gz:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-win_arm64.whl.

File metadata

  • Download URL: pypiron-0.0.3-py3-none-win_arm64.whl
  • Upload date:
  • Size: 6.5 MB
  • Tags: Python 3, Windows ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pypiron-0.0.3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 420b48175c6656e77cbc92c0b086c7306733f631ac2c6636417b6e4a720ae668
MD5 9a7c939d79a59a69d00b8c573edaed1b
BLAKE2b-256 bdc8e3ce352950e6474cfd53157678765c38c6ba19251c8a1f5a9462089778e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-win_arm64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-win_amd64.whl.

File metadata

  • Download URL: pypiron-0.0.3-py3-none-win_amd64.whl
  • Upload date:
  • Size: 6.9 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pypiron-0.0.3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 5ba149103171affbf10c9b002bd87571a96aa35eddee2536358c8c6d1afba69c
MD5 fd5b2b31d8833471403a8f2fa0dfb1fd
BLAKE2b-256 a6e51e76e7da7a503355aa75f367be7a7565daca13f05e28d59e6e052459f1b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-win_amd64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-win32.whl.

File metadata

  • Download URL: pypiron-0.0.3-py3-none-win32.whl
  • Upload date:
  • Size: 6.0 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for pypiron-0.0.3-py3-none-win32.whl
Algorithm Hash digest
SHA256 8df6c6d110feae3c2ef54157d60b74e1c50a9e9d05257e82c89b202de2b5ad7a
MD5 2b36c01e430943ceea0feeea00d24bdf
BLAKE2b-256 579bd081549f9cf1555a8b44cf428df6906b2f41a831918f2b7552cf90d80b98

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-win32.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f2036ac019c283a6e3e78e0ede3672e63a7dc31a57bc7e29ed9f29d408b898a7
MD5 cc06faa2ae2fcacf6131b3167487b36e
BLAKE2b-256 924885d10dc578e353f8f580a77e6f0e9da965dd591823b081261dce33efa472

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-musllinux_1_2_x86_64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 7ef5bd087ba43c746beccce12167b5f4c9cface95da8a3138d185a10f8fa1090
MD5 aef031b9145097136225d07cd2ca5efd
BLAKE2b-256 902f5d35e4c8b37a80b4649f497ed991e25a3dd5224efe7d27cfd399d83d6179

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-musllinux_1_2_i686.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 dc45040fb59cd9bb94a5914443f84ce3df8c6f82b64dcd7af7a10334ab6ea7d8
MD5 14af75d9bb56fb8c70be419c047fe38f
BLAKE2b-256 5aaa737db4329d6f2da39014c428165273ee5aced4e5b1185a83e3ee73837dbf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-musllinux_1_2_armv7l.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 14a4fa5e3e0491367306c60d4b15d1240025fb7006988ca5e5fb42d3be4c208c
MD5 9c278cd27ab06c9cf609419bfd641ab3
BLAKE2b-256 e8e8edfe884b4a43e6bebedd87dd49e995233e663a0a0d92319c8b45aae24985

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-musllinux_1_2_aarch64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_31_riscv64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_31_riscv64.whl
Algorithm Hash digest
SHA256 7ded6a7da3b0995ade51795372948207037907b4874f5ca834c2e33a17e32c32
MD5 cbfe6116a06edacc707f3fab5661c58f
BLAKE2b-256 df600133819ee522a5bf22864e837d50de4eeaac10ccd6c1317555a69e67db02

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_31_riscv64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7c9f949001b0728fb623be659b7d9a402f563f50d217123d8b7ccae58dc44808
MD5 3a4f6b33398a35e004772fbd2a3351ed
BLAKE2b-256 1105f6186ea4915950331d1ef5f491f266da0c2f34b0def8cc13f27ea0b34dcf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 71a96aacc6c79d3d01402ec68169094480981edf91c44bd247822ff9b2767dc8
MD5 0933b724de850995cab5f47c75ab6576
BLAKE2b-256 0d2b7c5c3eabc5d070b1de206096901a1900309a993a13076c6cc45e36998ab4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 24ff17bc4c84b43fcb9435cdc67ea6f905228f95ab104cc7dbf0190989fa5aa7
MD5 c3bd2f818bd947da2051ca20bcc45042
BLAKE2b-256 9b751173f8107be16183b99c359ba46d18ab23f7e01e86a5a4a4aec5029b16c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 04a8d8a04ea5a7124bee97215e4c07382bdc35485de1ca68bab81c9e0c105de1
MD5 5dc9ec3a8c401cc40efed244cc1c9225
BLAKE2b-256 95b7eb2f2f2bc6c0c1a1e2a0ea56934cc38d3b400b69dc0845f9b440699d7a56

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 edbe20310098d38645af852f853c2bbda265a1feeecbbfef3408d956ccbb418e
MD5 f24a164d47d9cb09e862b00463371aaa
BLAKE2b-256 6ab0e80d0ebd829ac8811a12fdec90c293cc269ef39678924faf08119608d79f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 667fc6c30de68eb9d9dc42861ca5e31a9657a10beff53964be6c84dee7b7a262
MD5 1fb2551a31ab6cee21a7127f0e027fc3
BLAKE2b-256 ceb0d9b14913cfbb8157cfc11c22e5a605ffae37fd71f42435bb814664fbc8a9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0ba872f461802f24ec252aa13cad69f1e324cb7e1f5de28e58fbec83390f9b4d
MD5 d6c5d513be6ea6557f740da722978836
BLAKE2b-256 a9317debe20fe83c45280ead33ea1f8b5ca9c1e421ffe71b7c20ccdcaa1221c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-macosx_11_0_arm64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pypiron-0.0.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 3cf0aa840daf7995ef8c64212283cfe288bd0c6873634e5dd7c409d6279c9c2a
MD5 79f52e3e91253e810ffdd17cdd8066e8
BLAKE2b-256 9b0b7ad105abcfaacbaf382fc4731c1b2656f433a597e2fdcb7a037f2793d8ef

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.3-py3-none-macosx_10_12_x86_64.whl:

Publisher: ci.yml on brycedrennan/pypiron

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page