# Installing extension at user level

**URL:** <https://discourse.jupyter.org/t/installing-extension-at-user-level/15069>\
**Category:** extensions\
**Created:** [July 24, 2022, 11:56pm UTC](https://discourse.jupyter.org/t/installing-extension-at-user-level/15069 "2022-07-24T23:56:53Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Freso](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.jupyter.org/freso/32/7590_2.png) [@Freso](https://discourse.jupyter.org/u/Freso)\
**Post date:** [July 24, 2022, 11:56pm UTC](https://discourse.jupyter.org/t/installing-extension-at-user-level/15069/1 "2022-07-24T23:56:53Z")

</div>

[Extensions — JupyterLab 4.0.9 documentation](https://jupyterlab.readthedocs.io/en/stable/user/extensions.html) and [Extensions — JupyterLab 4.1.0a4 documentation](https://jupyterlab.readthedocs.io/en/latest/user/extensions.html) both suggest that there’s a `--level user` option that can be used to install extensions as a user:

> When using the command line, you can target the `--level` of the config: `user`, `system`, or `sys-prefix` (default).

However it is entirely unclear where this flag is supposed to go. `jupyter --level user labextension install my-extension`, `jupyter labextension --level user install my-extension`, and `jupyter labextension install --level user my-extension` all complain about not knowing about a “level” alias (or `jupyter-user` not being a valid (sub)command).

Are the docs outdated? Am I missing something somewhere?

```auto
> jupyter --version
Selected Jupyter core packages...
IPython : 8.4.0
ipykernel : 6.15.1
ipywidgets : 7.7.1
jupyter_client : 7.3.4
jupyter_core : 4.11.1
jupyter_server : 1.18.1
jupyterlab : 3.4.4
nbclient : 0.6.6
nbconvert : 6.5.0
nbformat : 5.4.0
notebook : 6.4.12
qtconsole : not installed
traitlets : 5.3.0

```

---

<div class="post-metadata">

**Author:** ![bollwyvl](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.jupyter.org/bollwyvl/32/904_2.png) [@bollwyvl](https://discourse.jupyter.org/u/bollwyvl)\
**Post date:** [July 25, 2022, 3:42pm UTC](https://discourse.jupyter.org/t/installing-extension-at-user-level/15069/2 "2022-07-25T15:42:25Z")

</div>

Those are only in the enabling/disabling of _already installed_, built-in extensions in `$PREFIX/share/jupyter/lab/static` or pre-built extensions `$PREFIX/share/jupyter/labextensions`

```auto
jupyter labextension enable --level=user my-extension
jupyter labextension disable --level=user my-extension

```

Non-developer use of `jupyter labextension install` (or even `jupyter lab build`) invokes the whole `nodejs`-based machinery, and can incur additional complexity while reducing the predictability of the final system, especially over time.

Ideally, all extensions would be provided by `pip` (or `conda` or whatever) packages, and installed into `$PREFIX/share/jupyter/labextensions` which helps ensure the frontend, and any backend, versions all match correctly, and can be managed/upgraded by a single `requirements.txt` or `environment.yml`, as a prelude to being locked for reproducibility by `pip-tools` or `conda-lock`.

There are some additional features for finding pre-built extensions in more places, as controlled by [`jupyter --paths`](https://github.com/jupyter/jupyter_core/blob/bc6b77133525e4a724eeee6e244e404161cf9e41/jupyter_core/paths.py#L141), which can be extended by environment variables or by the [`LabApp.labextensions_path`](https://github.com/jupyterlab/jupyterlab/blob/6c091561624110fe993f12fa0d9572c3ef418e26/jupyterlab/labextensions.py#L123), but again, this can increase the unpredictability of the installation.
