JupyterHub Apps Launcher
JupyterHub Apps Launcher is a generalized server launcher. The goal of this project is to support launching anything like say a Flask Server, FastAPI server or a Panel Dashboard via a user supplied command. Currently, the following frameworks are supported:
- Panel
- Bokeh
- Streamlit
- Plotly Dash
- Voila
- Gradio
- JupyterLab
- Generic Python Command
Installation
uv pip install jhub-apps
or via conda
conda install -c conda-forge jhub-apps
Development Installation
Install Dependencies
uv sync --extra dev
To develop the React UI frontend, also run:
cd ui
npm install
cd -
K3d Development Environment
For testing JupyterHub Apps with Kubernetes spawners (e.g., KubeSpawner), you can use the k3d development environment which provides a local Kubernetes cluster with Tilt for rapid development.
Prerequisites:
cd k3s-dev
make up
Once started, access JupyterHub at http://localhost:8000 (login with any username and password password)
To tear down the environment:
make down
Starting JupyterHub
Set the following environment variable:
export JHUB_APP_JWT_SECRET_KEY=$(openssl rand -hex 32)
Start JupyterHub:
jupyterhub -f jupyterhub_config.py
Now go to http://127.0.0.1:8000/hub/home to access JHub Apps Launcher
API Endpoints
The Hub service is exposed via FastAPI endpoints. The documentation for the same can be accessed at: http://127.0.0.1:10202/services/japps/docs
To try out authenticated endpoints click on the Authorize button on the top right of
the above url and choose OAuth2AuthorizationCodeBearer and click on Authorize.
Developing Locally
Note: In order to develop locally, both the JupyterHub backend and React UI frontend should be running.
- To start the JupyterHub Backend, run the following in a terminal:
jupyterhub -f jupyterhub_config.py
- To start the React UI frontend, run the following in a separate terminal from the
uidirectory:
npm run watch
Running Tests
Unit Tests
pytest jhub_apps/tests
E2E Tests
pytest jhub_apps/tests/tests_e2e -vvv -s --headed
Usage
JHub Apps has been tested with local JupyterHub using SimpleLocalProcessSpawner and with
The Littlest JupyterHub using SystemdSpawner.
- Install JHub Apps
uv pip install git+https://github.com/nebari-dev/jhub-apps.git
- Add the following in The Littlest JupyterHub's
jupyterhub_config.py
from tljh.user_creating_spawner import UserCreatingSpawner
from jhub_apps.configuration import install_jhub_apps
c.JupyterHub.bind_url = "<YOUR_JUPYTERHUB_URL>"
c.SystemdSpawner.unit_name_template = 'jupyter-{USERNAME}{JHUBSERVERNAME}'
c.JAppsConfig.apps_auth_type = "oauth" # or none (if you don't want authentication on apps)
c.JAppsConfig.python_exec = "python3"
# Pass in the path to jupyterhub config
c.JAppsConfig.jupyterhub_config_path = "jupyterhub_config.py"
# Either a static list of conda environments to show in the
# create panel apps form or a callable to fetch conda enviornments
# dynamically, e.g. from conda-store API
c.JAppsConfig.conda_envs = []
c = install_jhub_apps(c, UserCreatingSpawner)
Acknowledgments
This project is heavily inspired by and uses code from @danlester's cdsdashboards, without his work building this would have been a whole lot harder.
Metadata
Release files for jhub-apps 2026.11.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| jhub_apps-2026.11.1.tar.gz | 9.6 MB | Without provenance | Details for jhub_apps-2026.11.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| jhub_apps-2026.11.1-py3-none-any.whl | Python 3 | none | any | Details for jhub_apps-2026.11.1-py3-none-any.whl |
Total release size: 12.9 MB
Release files / jhub_apps-2026.11.1.tar.gz
| Download URL | jhub_apps-2026.11.1.tar.gz |
|---|---|
| Size | 9.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
70ad77333a31b560817e4f02d7b966257c32ffe97e911594e0f69b3ffe6bd8c4
|
|
BLAKE2b-256 checksum How to use checksums |
a8b0640709766d2be8c80ae2ceb736e91f4fded1c15da103034fd0ca55300908
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.12.16 HTTPX/0.28.1
|
Release files / jhub_apps-2026.11.1-py3-none-any.whl
| Download URL | jhub_apps-2026.11.1-py3-none-any.whl |
|---|---|
| Size | 3.2 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0804cdb8d35495990a62c165c1f52fe795015ec77cc008d63557d33414b37ccf
|
|
BLAKE2b-256 checksum How to use checksums |
18bd84f00958b1152b042afbaaaf3bf46c12f7c05451cb6e85526b4714647c96
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
Hatch/1.16.5 cpython/3.12.16 HTTPX/0.28.1
|
Security for jhub-apps 2026.11.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.