JupyterHub allows each user to have their own Jupyter notebook server by using a central hub that handles authentication, spawns single-user notebook servers on demand, and proxies requests to the various user servers. The hub consists of a user database, authenticator to check user identities, and a spawner that creates the individual user servers. JupyterHub is useful for classes where students can do homework, workshops that require installation, or research groups that want to share computing resources through a centralized hub.