pypiserver
github.com
What it is
pypiserver is a minimal, self-hosted package index for uploading and downloading Python packages with tools such as pip and easy_install. It serves packages from regular directories, including wheels, bdists, eggs and PGP signatures, and scans those directories recursively. Packages can be uploaded with pip, setuptools, twine or pypi-uploader, or copied to the server with scp. Upload access can be protected with an Apache htpasswd file; API users can configure custom authentication callables. The maintainers advise password protection for uploads, and the documentation recommends a reverse proxy to provide HTTPS. pypiserver can run as a WSGI application, with documented integrations for Docker, nginx, Apache, gunicorn and Paste. It provides a health endpoint that returns HTTP 200 when the service is running, with an option to configure the endpoint. The current version supports Python 3.10+ and PyPy3. It is free at free and is listed for Linux, macOS, Windows, API and self-hosted use. Its API covers the operations needed by common package tools rather than the full PyPI API; documentation uploads are accepted but not saved to disk.
Spec sheet
- Purpose
- pypiserver is a minimal PyPI-compatible server for uploading and downloading Python packages with pip or easy_install.Read 10 Oct 2026 · github.com
- Intended users
- The project describes itself as a self-hosted package index for users who want to serve their own Python packages.Read 9 Oct 2026 · github.com
- Deployment
- The project publishes Docker images for main branch pushes and dev, alpha, beta, and final releases.Read 10 Oct 2026 · github.com
- Integrations
- The documentation shows integration with pip, easy_install, setuptools, twine, Docker, and reverse proxies including Nginx and Traefik.Read 10 Oct 2026 · github.com
- Support
- The maintainers direct users to GitHub Discussions and a Zulip community chat, and direct bug reports to GitHub’s bug tracker.Read 10 Oct 2026 · github.com
- License
- The project’s remaining code is distributed under the zlib/libpng license, and its bundled Bottle copy is MIT-licensed.Read 10 Oct 2026 · github.com
- API and servers
- Its API returns a WSGI application that can be run with supported or user-chosen WSGI servers.Read 10 Oct 2026 · github.com
- API limit
- pypiserver implements only enough of the PyPI API for easy_install, pip install, and search, rather than the full API.Read 9 Oct 2026 · github.com
- Authentication
- Uploads can be protected with Apache htpasswd authentication, and API users can configure a custom authentication callable.Read 10 Oct 2026 · github.com
- Clients
- Standard Python packaging tools including pip and twine can use it as a package index.Read 9 Oct 2026 · github.com
- Docker
- Official Docker images are built for main pushes and development, prerelease, and final releases.Read 9 Oct 2026 · github.com
- Documentation limitation
- It accepts documentation uploads but does not save them to disk.Read 9 Oct 2026 · github.com
- Health checks
- It provides a default /health endpoint that returns HTTP 200 when the service is up and supports a configurable endpoint.Read 9 Oct 2026 · github.com
- HTTPS
- The documentation recommends putting pypiserver behind a reverse proxy to provide HTTPS.Read 9 Oct 2026 · github.com
- Limitations
- It does not implement the full PyPI API and documents that it accepts documentation uploads but does not save them to disk.Read 10 Oct 2026 · github.com
- Package formats
- It supports wheels, source distributions, eggs, and accompanying PGP signatures.Read 10 Oct 2026 · github.com
- Platform support
- The README includes Windows service instructions using NSSM and systemd service instructions for Linux.Read 10 Oct 2026 · github.com
- PyPI compatibility
- It implements the PyPI interfaces needed for standard packaging tools such as pip and twine to use it as a package index.Read 10 Oct 2026 · github.com
- Python support
- The current version works with Python 3.10+ and PyPy3; older Python versions are not tested and the 1.x series is unsupported.Read 10 Oct 2026 · github.com
- Scale limit
- The server scans the package directory for each incoming HTTP request by default, which can noticeably slow down service for thousands of packages; directory caching can improve performance.Read 9 Oct 2026 · github.com
- Security guidance
- The project strongly advises password-protecting uploads and describes HTTPS deployment through a reverse proxy as the preferred approach.Read 10 Oct 2026 · github.com
- Storage
- It serves packages from regular directories and scans package directories recursively.Read 10 Oct 2026 · github.com
- Upload methods
- Packages can be uploaded with pip, setuptools, twine, pypi-uploader, or copied with scp.Read 10 Oct 2026 · github.com
- Uploading
- Packages can be uploaded with pip, setuptools, twine, pypi-uploader, or copied to the server with scp.Read 9 Oct 2026 · github.com
Plans and prices
Strong points and limits
Strong points
- Serves packages from regular directories.
- Supports pip and twine as package-index clients.
- Uploads can use several tools or scp.
- Docker images and WSGI deployment are documented.
Limits
- Uploads should be password protected.
- HTTPS requires a reverse proxy.
- It does not implement the full PyPI API.
- Documentation uploads are not saved to disk.
Who it suits
pypiserver suits people who want to host their own Python package index and use standard packaging tools to access it. It is intended for self-hosted deployment and supports common package workflows.
Verdict
pypiserver covers core package-index needs for a self-hosted Python package repository. Its limited API, upload security setup and lack of saved documentation uploads are relevant constraints when choosing it.
Where Specifiction places it
- Artifact repository software#16 of 648.4
- Package Registries#11 of 288.3