(contributing-packages)=

# Environments & Packages

TLJH installs packages from different sources during installation.
This document describes the various sources and how to upgrade
versions of packages installed.

## Python Environments

TLJH sets up two python environments during installation.

1. **Hub Environment**. JupyterHub, authenticators, spawners, TLJH plugins
   and the TLJH configuration management code is installed into this
   environment. A [venv](https://docs.python.org/3/library/venv.html) is used,
   primarily since conda does not support ARM CPUs and we'd like to support the
   RaspberryPI someday. Admins generally do not install custom packages
   in this environment.
2. **User Environment**. Jupyter Notebook, JupyterLab, kernels,
   and packages the users wanna use (such as numpy, scipy, etc) are installed
   here. A [conda](https://conda.io) environment is used here, since
   a lot of scientific packages are available from Conda. `pip` is still
   used to install Jupyter specific packages, primarily because most notebook
   extensions are still available only on [PyPI](https://pypi.org).
   Admins can install packages here for use by all users.

## Python package versions

In `installer.py`, most Python packages have a version specified. This
can be upgraded freely whenever needed. Some of them have version checks
in `integration-tests/test_extensions.py`, so those might need
updating too.

## Apt packages

Base operating system packages, including Python itself, are installed
via `apt` from the base Ubuntu repositories.

We generally do not pin versions of packages provided by apt, instead
just using the latest versions provided by Ubuntu.
