Fast as the falcon, sealed as the pyx. peryx is one artifact server for many packaging ecosystems, written in async Rust.
Point pip, uv, or twine at it for Python and docker or any registry client at it for containers, all from one
process. Each index caches an upstream, hosts your own uploads, or merges the two so a package you publish shadows the
upstream of the same name. A new ecosystem is a driver, not a rewrite.
- 🦅 One server for many ecosystems: PyPI and OCI today, with more added as drivers rather than forks.
- ⚡ One async Rust process: zero-config on a laptop, scaling to a cluster when configured.
- 🔀 Three roles for every ecosystem: a caching proxy, a hosted store you publish to, and a virtual index that merges them.
- 🔒 Content-addressed storage: each artifact is keyed by its SHA-256, so identical bytes are stored once, deduplicated across ecosystems, and tamper-evident.
- 🛡️ Batteries included: an allow/deny policy engine, full-text search, Prometheus metrics, and signed webhooks.
- 🧩 Neutral by design: the server names no format, and each ecosystem plugs into one interface.
Build from source and start the server:
cargo build --release
./target/release/peryx serveperyx runs zero-config on 127.0.0.1:4433. Point it at real upstreams, turn on hosted uploads, and tune caching through
its configuration.
peryx's documentation lives at peryx.readthedocs.io: tutorials, how-to guides, the
configuration and endpoint reference, and design explanations. Run peryx --help for the command-line reference.
Serve the Simple repository API as a caching proxy, a hosted index, or a virtual blend of both:
uv pip install --index-url http://127.0.0.1:4433/root/pypi/simple/ requests
twine upload --repository-url http://127.0.0.1:4433/root/pypi/ dist/*Serve the OCI distribution spec so any container client pulls and pushes through peryx:
docker pull 127.0.0.1:4433/dockerhub/library/alpineEvery ecosystem gets the same three behaviors for free:
- Cached proxies an upstream and keeps serving the last good copy for a bounded window when the upstream is unreachable.
- Hosted accepts your uploads and holds them durably.
- Virtual merges other indexes under one route, so a package you publish shadows the upstream of the same name.
A neutral allow/deny policy engine, full-text package search, Prometheus-format metrics, and signed webhooks ship with the server, not as add-ons.
See CONTRIBUTING.md for the development setup and the architecture overview for how the crates fit together. proposal.md holds the original design document and roadmap.
peryx is licensed under the MIT license.