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.2.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.2-py3-none-win_arm64.whl (6.5 MB view details)

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

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

Uploaded Python 3Windows x86

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

Uploaded Python 3musllinux: musl 1.2+ x86-64

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

Uploaded Python 3musllinux: musl 1.2+ i686

pypiron-0.0.2-py3-none-musllinux_1_2_armv7l.whl (6.5 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

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

Uploaded Python 3musllinux: musl 1.2+ ARM64

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

Uploaded Python 3manylinux: glibc 2.31+ riscv64

pypiron-0.0.2-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.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (6.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

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

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

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

Uploaded Python 3manylinux: glibc 2.17+ i686

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

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

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

Uploaded Python 3manylinux: glibc 2.17+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

pypiron-0.0.2-py3-none-macosx_10_12_x86_64.whl (6.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: pypiron-0.0.2.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.2.tar.gz
Algorithm Hash digest
SHA256 b389c495d544d8a55f9aa044771e704293e29a1fb8c11c2eb1e66241a4f4de63
MD5 7f95454ef14f6893c8e82e787f351291
BLAKE2b-256 fd6ecba79519e3377cf9f961f0709ba545b23a2e34024871fde5ed006947d42a

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2.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.2-py3-none-win_arm64.whl.

File metadata

  • Download URL: pypiron-0.0.2-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.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 b6336889262e5ea2ca7bae122464d1a55709b9088855834dcee76c113b5498bf
MD5 51dd8d03a1d61a2eee97dec6471168b3
BLAKE2b-256 d59ee037fb33e3a0851b3bb1e7aa6f23b8100aac556daabd2ae979f759abc7a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-win_amd64.whl.

File metadata

  • Download URL: pypiron-0.0.2-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.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 16c7174a515f1812e2bbb33ca24134601780736ca529b9bff6baeb842ffb5b15
MD5 128f068c33781b3e0f727ae388969d03
BLAKE2b-256 a64a1e3ff977a6d630c873e98e62000f2a01f745d3c873e9d00170984173ba5b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-win32.whl.

File metadata

  • Download URL: pypiron-0.0.2-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.2-py3-none-win32.whl
Algorithm Hash digest
SHA256 71fc9fdfcf38bdcdca0711877ee59908b114a38169151b8e3f8d9ab4d69a9a8b
MD5 182756cded6f37b24a445b26f0c5b381
BLAKE2b-256 1d5b59de315d6a57358f85a9d4db81925943474f7dee838385191516b06c9218

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0fbf452ba6c885be8cb08ee6a49dc41dfb6a5a726a9e937bb971f085918550a5
MD5 8d239829165b9a01251713efe9273250
BLAKE2b-256 2277a3a9d2d17965b3bca046f64b99600351a092b2453fb8294fc43a7b1230fc

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 fae6e4c8f6e33301648ff15511c22b351269225e1626803b54178c1c3be93784
MD5 91da876fc702e1ae8e86bbeaf07cbff3
BLAKE2b-256 bdad50ec64bea6da4466da076199d3e7db7de3e269589cd58d0433840059318b

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 9ae26b55091c7e2da919b7880bacf5678649d3a4169744c6b9636ca67182fa97
MD5 fd8dd51701659cc4cab93898bdf0f8b1
BLAKE2b-256 ec32eca8ea70fb5723827934943dafe30897dad3cec83b390bcd8119007677cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 92d38046d22f505ddd19667dcc7281f3b79fd4c2708303b7e97f93a3a475c143
MD5 a842a96cf9fbd64f05a3cdcba1c1bbcd
BLAKE2b-256 9cf4cc3623cc6366f060403e637230d17a5e1b264fdbe5115aa455ad7469e073

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_31_riscv64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_31_riscv64.whl
Algorithm Hash digest
SHA256 80b75c4c696125fd8118f3e8aac79563b1ec0482a79c230f7748295004715f89
MD5 0fb723245b7e2806673b91fce871fbbd
BLAKE2b-256 2378a9b99805762caf608ade90f3719f4cf6bbc6bcac1614ceaacdeea1b1cb52

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ee6eef9ffe26146496292ccf72e5c29fba92c58fb63b800015c6cbf000101e07
MD5 3945f3a06d15b281a6100f15e20117e6
BLAKE2b-256 af2176f93e30184d36bd48b3d6a3fccff4bccedebe12c1dad4e5440253382bed

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 6c954633271e53a05df80fbf783d190927e33644cfe2ac058edd26f04b1a0782
MD5 0fa96e6f9d96523438285d07b4bc43fc
BLAKE2b-256 91aaa68a85955a9ebf7e1c4c3b6da9d0c0cd31c541b362ef01b20c16d9de0853

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 48e1562205a96f78a79bd525af99dd0ae016a6a865ac3adb77b2104320f90e6b
MD5 9c12dd3be9d50a3678890b0ac5c1fabc
BLAKE2b-256 065f42f73fc5f3632c4570fd40f10e0c9722bf17910e78620c682ac235b8aabb

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 e8d2356d5715e034dcc04c6d2322eadecbdd512ffb02156eb2c656479ea1fde7
MD5 4ff86006dca1c6846f1fbc2e5c43f9eb
BLAKE2b-256 f35264078fa7c50896e13e8af2d430ab6429ba37a44e78764f8c781511dbee6f

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 9b6e4f648ad2712e46fdf2860621cc3b7042d5c5915f8e0f92784fb535161244
MD5 6147a92684d1d02267d12caa5f6082bb
BLAKE2b-256 cd1acdc56c9cf22c8b45007d1d97dd2a2eaf196fa8d452b0c22fc306bb517ae2

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 457a71361de8c7cabc815361699d2aad503ea175900628cbf284e505d0c66ac4
MD5 7de0f5bad9b62a6eaaa18d7997e25334
BLAKE2b-256 31de128585cc9be639a99af31de21ea51b538ce34b73b6beae46c63fd93ffa8c

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a50020bd00230ceae2d52d63bd74817b8a11e6968a829419774f584ec7c6c73c
MD5 1558328aa26a193731fc868583ac1d14
BLAKE2b-256 acea02b69c7f3f9f40efb9c83e67e1740d30710e4dd789b2a6d3e4fd3cbd4416

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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.2-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for pypiron-0.0.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b78b5b0eed70ee101aac4f6fb987bfce3e7a399d9dbb751aed6e6d245f54e8f6
MD5 17317451e0c71597116fe0cbd6d2ccb9
BLAKE2b-256 1b8a24d70eae06b2d958bd49d1c03c0518914a9a880ef23c51efc8d2d1c24938

See more details on using hashes here.

Provenance

The following attestation bundles were made for pypiron-0.0.2-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