jupyterhub
JupyterHub: A multi-user server for Jupyter notebooks
What it is and what it does
JupyterHub is a production-grade multi-user server for Jupyter notebooks. It consists of a central Hub (a tornado process), a configurable HTTP proxy, and multiple single-user notebook servers. The Hub handles user login, spawns notebook servers on demand, and configures the proxy to route traffic to each user's server. It is designed to serve notebook instances to classrooms, research teams, data science workgroups, or HPC clusters.
The package depends on 18 runtime libraries including tornado for the web server, SQLAlchemy for user/group management, Pydantic for configuration, and OAuth/PAM libraries for authentication. It ships with a built-in PAM authenticator and LocalProcessSpawner, but supports pluggable authenticators (LDAP, Kerberos, OAuth) and spawners (Docker, Kubernetes, batch schedulers) via separate packages. Configuration is file-based, and the Hub exposes a REST API for administration.
Use it for:
- Run a shared Jupyter environment for a classroom where each student gets their own isolated notebook server.
- Deploy a data science workgroup hub where team members access notebooks on a shared server with centralized user management.
- Set up a research cluster where HPC batch jobs spawn notebook servers for interactive analysis on compute nodes.
- Provide a Docker-based notebook service where each user's server runs in an isolated container with custom environments.
- Integrate with enterprise authentication (LDAP, Kerberos, OAuth) to manage notebook access across an organization.
Worth the install?
AI-flagged interpretation of the facts on this page — verify before relying
JupyterHub is a multi-user server that spawns, manages, and proxies multiple single-user Jupyter notebook instances, allowing many users to access notebook servers through a shared Hub.
Yes. JupyterHub is actively maintained, production-stable, has no known vulnerabilities, and low install friction. Install it if you need to serve Jupyter notebooks to multiple users with centralized management. The main gotcha is that you must install and configure the nodejs proxy separately, and running as a non-root user requires additional system setup—but both are documented. Not needed for single-user notebook access.
Install
jupyterhub on PyPI
pip
pip install jupyterhubuv
uv add jupyterhubpoetry
poetry add jupyterhubInstalling jupyterhub
Before you install
Installation is low-friction as a pure Python package, though the Hub requires nodejs/npm for the proxy component and PAM or another authenticator on the host system. The project is actively maintained with a recent release and 8328 repository stars.
License in practice
BSD-3-Clause is a permissive license; you can use, modify, and distribute JupyterHub with minimal restrictions, provided you include the license notice.
Quickstart
npm install -g configurable-http-proxy
pip install jupyterhub
jupyterhub --generate-config
jupyterhub
Requires nodejs/npm for the proxy, Python 3.8 or greater, a Linux/Unix system, and either PAM or a configured authenticator (e.g., OAuthenticator) for multi-user access.
Verify before relying
- Whether the default PAM authenticator works out-of-the-box on all Linux distributions without additional system configuration.
- Performance characteristics when scaling to hundreds or thousands of concurrent users.
- Whether running as a non-root user requires specific sudoers or systemd configuration beyond what the docs describe.
Package facts
| License | BSD-3-Clause (permissive) |
| Python support | supports the current Python release (>=3.8) |
| Install friction | low — pure-Python wheel |
| Runtime dependencies | 18 — alembic, async_generator, certipy, idna, importlib_metadata, jinja2, jupyter_events, oauthlib, packaging, pamela, prometheus_client, psutil, pydantic, python-dateutil, requests, SQLAlchemy, tornado, traitlets |
| Maintenance | actively maintained — 4 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 374,964/month — #7,143 on PyPI (30-day window, as of 2026-08-14) |
| Known vulnerabilities | none known (OSV.dev, checked 2026-08-14) |
Evidence: jupyterhub-5.5.1-py3-none-any.whl
Keywords: Interactive, Interpreter, Shell, Web, Jupyter
Tags
More Dynamic Content packages
MarkupSafe provides a text object that escapes…
permissive · top 100 on PyPI
Jinja2Jinja2 is a templating engine that renders…
permissive · top 100 on PyPI
soupsieveSoupsieve is a CSS selector library designed to…
permissive · top 100 on PyPI
WerkzeugWerkzeug is a WSGI utility library providing…
permissive · top 1,000 on PyPI
FlaskFlask is a lightweight WSGI web application…
permissive · top 1,000 on PyPI
MakoMako compiles Python-embedded templates into…
permissive · top 1,000 on PyPI
jupyter-collaborationAdds real-time collaborative editing to…
permissive · top 15,000 on PyPI
jupyter-server-proxyJupyter Server Proxy runs external processes…
permissive · top 15,000 on PyPI
jupyter-collaboration-uiAdds real-time collaboration UI elements to…
permissive · top 15,000 on PyPI
jupyter-docproviderAdds real-time collaborative editing to…
permissive · top 15,000 on PyPI
jupyter-server-ydocAdds real-time collaborative editing to Jupyter…
permissive · top 5,000 on PyPI
notebookJupyter Notebook is a web-based interactive…
permissive · top 1,000 on PyPI
jupyter-http-over-wsAdds a WebSocket-based HTTP proxy endpoint to…
permissive · top 15,000 on PyPI
simpervisorProvides async methods to start, manage, and…
permissive · top 15,000 on PyPI
oauthenticatorOAuthenticator provides OAuth2 login handlers…
permissive · top 15,000 on PyPI
pybatfishPybatfish is a Python client for Batfish, a…
permissive · top 15,000 on PyPI