Layered Jupyter container images and project-local JovyKit environments.
Project description
JovyKit
Disposable JupyterLab environments that feel like Python virtualenvs.
JovyKit gives each project a readable Dockerized JupyterLab environment.
Run jovy init, start Jupyter, throw the container away, keep the notebooks.
Install
JovyKit requires Docker Engine and the Docker Compose plugin. On macOS and Windows, install Docker Desktop first. On supported Linux distros, JovyKit can print or run the Docker install plan.
pip install jovykit
# or
uv tool install jovykit
jovy install-docker --dry-run
jovy doctor
jovy --version
Run jovy install-docker --yes only after reading the dry run output.
Quick Start
pip install jovykit
jovy init
jovy up -d
jovy open
Use a pinned Python image or GPU mode when you need it:
jovy init --python 3.13
jovy init --gpu all --python 3.13
Why?
Machine learning environments are annoying.
- Conda environments drift.
- Docker Compose is repetitive.
- Jupyter setup takes boilerplate.
- GPU configuration is fragile.
- Reproducing environments across machines is painful.
JovyKit makes Dockerized Jupyter environments feel lightweight and disposable.
What You Get
- One command creates
compose.yaml,Dockerfile,requirements.txt,work/, and.jupyter/. - Notebooks and Jupyter settings persist; container state stays disposable.
jovy addandjovy removeeditrequirements.txt.up,down,start,stop,config,logs,build, andwatchbehave like Docker Compose.- GPU support is explicit with
jovy init --gpu all. jovy compose ...is the Docker Compose escape hatch.
There is no JovyKit config file.
Edit compose.yaml, Dockerfile, or requirements.txt directly.
Requirements
- Python 3.9 or newer on the host.
- Docker Engine and the Docker Compose plugin, or Docker Desktop on macOS/Windows.
- Linux auto-install support for Ubuntu, Debian, Fedora, RHEL, and CentOS.
- Optional GPU runtime support for
gpus: all.
jovy doctor checks Docker, Compose, daemon access, GPU support, and project files.
Common Commands
jovy install-docker --dry-run
jovy doctor
jovy add pandas scikit-learn
jovy build
jovy watch
jovy logs -f
jovy token show
jovy token rotate
jovy status
jovy shell
jovy down
jovy compose ps
Documentation
Troubleshooting runtime startup issues:
How JovyKit Works
compose.yaml is runtime.
Dockerfile is the project overlay.
requirements.txt is project Python packages.
Python comes from the selected image tag, for example :base-python-3.12.
jovyinitializes an empty directory, or prints help in an existing project.jovy initcreatescompose.yaml,Dockerfile,requirements.txt,.devcontainer/devcontainer.json,work/, and.jupyter/.jovy status,shell,run,open, anddoctoradd small Jupyter-focused conveniences.
Images
Image levels map to published JovyKit images:
ghcr.io/mihneateodorstoica/jovykit:minimal-python-3.13
ghcr.io/mihneateodorstoica/jovykit:base-python-3.12
ghcr.io/mihneateodorstoica/jovykit:extended-python-3.13
ghcr.io/mihneateodorstoica/jovykit:full-python-3.13
minimal and base publish Python 3.9 through 3.14 tags.
extended and full publish Python 3.11 through 3.13 tags.
latest points at minimal-python-3.14. Scheduled images also get level-specific tags such as base-nightly-python-3.11, base-weekly-python-3.11, and base-monthly-python-3.11.
minimal, base, and extended are curated cuts from the full stack.
full is intentionally huge and keeps heavyweight ML, AI, cloud, distributed,
and app runtimes in one batteries-included layer.
jovy init --image-level minimal --python 3.11
jovy init --image-level base --python 3.12
jovy init --image-level extended --python 3.13
jovy init --image-level full --python 3.13
The generated Compose file passes only JOVY_BASE_IMAGE.
It does not pass a Python version build argument.
Build published image targets from the single multi-stage Dockerfile:
./build.sh minimal
./build.sh --python-version 3.13 base
./build.sh --python 3.11 --python 3.12 --python 3.13 all
./build.sh --python 3.14 --latest minimal
./build.sh --python 3.11 --channel nightly base
With no args, ./build.sh builds all supported image and Python tag pairs.
Dependencies
Use requirements.txt.
jovy add pandas scikit-learn
jovy remove pandas
Compose Watch rebuilds when dependency files change:
jovy watch
Persistent Files
Generated projects mount only the durable user paths:
./work -> /home/jovyan/work
./.jupyter -> /home/jovyan/.jupyter
Project notebooks and Jupyter settings survive rebuilds and container removal. Other container state is disposable.
Security Model
JovyKit is intended for local development first.
- Default exposed surface:
compose.yamlmaps a single Jupyter port by default:127.0.0.1:<host-port>:8888(default8888).- This keeps Jupyter on loopback by default; it is not reachable from other hosts
unless you change
portsto a non-loopback bind.
JUPYTER_TOKENis written intocompose.yamland required by Jupyter. Rotate it withjovy token rotate, or set one withjovy token rotate --token NEW_TOKEN, thenjovy down && jovy up -d. (Restarting is required so the container picks up the new token.)- Files that commonly hold sensitive state:
compose.yaml(JUPYTER_TOKENand generated runtime config)./.jupyter(credentials, server config, extension state)- any project token values in
Dockerfile,requirements.txt, or.devcontainer/devcontainer.json
- Docker access is host-level privilege: adding your user to the docker group grants
root-equivalent host access through
/var/run/docker.sock. Treat that boundary as part of your local security model.
If you expose Jupyter publicly, do this only intentionally:
- bind only on trusted hosts/networks,
- put
compose.yamlunder review first, - rotate tokens before sharing access,
- add host-level controls (firewall, VPN, reverse proxy auth).
See the full security guide: Security model.
GPU
GPU support is explicit:
jovy init --gpu none
jovy init --gpu all
By default, jovy init uses all when a local GPU is detected.
none omits the Compose GPU field.
all writes Compose gpus: all.
Repository Checks
ruff check .
black --check .
mypy jovykit tests main.py
pytest --cov=jovykit --cov-report=term-missing
Docker checks are opt-in:
pytest -m docker --run-docker
Repository Layout
jovykit/ Python CLI package
image/ Published image layers
site/ GitHub Pages site
wiki/ GitHub Wiki source
.github/workflows/ CI, release, docs, and image automation
License
JovyKit is licensed under the MIT License. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jovykit-8.7.0.tar.gz.
File metadata
- Download URL: jovykit-8.7.0.tar.gz
- Upload date:
- Size: 45.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
637ff0cc9784c13238b87a2567b79513a0f9fe71c0bd762ff1574e626131cc70
|
|
| MD5 |
eae45c92ce1d8596c5ed362d8fe3f338
|
|
| BLAKE2b-256 |
67034f5fb9e21b97bcc17a6f61b03bbb505dec3fb628ef4cec377b5f9f48cb4e
|
Provenance
The following attestation bundles were made for jovykit-8.7.0.tar.gz:
Publisher:
ci-release.yml on MihneaTeodorStoica/jovykit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jovykit-8.7.0.tar.gz -
Subject digest:
637ff0cc9784c13238b87a2567b79513a0f9fe71c0bd762ff1574e626131cc70 - Sigstore transparency entry: 1601856346
- Sigstore integration time:
-
Permalink:
MihneaTeodorStoica/jovykit@3df6e527b5a431d847e53e92442eee204c5b7439 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MihneaTeodorStoica
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci-release.yml@3df6e527b5a431d847e53e92442eee204c5b7439 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jovykit-8.7.0-py3-none-any.whl.
File metadata
- Download URL: jovykit-8.7.0-py3-none-any.whl
- Upload date:
- Size: 27.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e94b230b7debc37bb47d83ac7239c88d4e3205eedeaad404812e53a0924fc44d
|
|
| MD5 |
824bc6240d3f42343f0e6a7f0f9e4c77
|
|
| BLAKE2b-256 |
3ecbc4b353f2d25316b2c53c95c98bf5df0019ff6fc947f27a428053556e0f64
|
Provenance
The following attestation bundles were made for jovykit-8.7.0-py3-none-any.whl:
Publisher:
ci-release.yml on MihneaTeodorStoica/jovykit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jovykit-8.7.0-py3-none-any.whl -
Subject digest:
e94b230b7debc37bb47d83ac7239c88d4e3205eedeaad404812e53a0924fc44d - Sigstore transparency entry: 1601856354
- Sigstore integration time:
-
Permalink:
MihneaTeodorStoica/jovykit@3df6e527b5a431d847e53e92442eee204c5b7439 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/MihneaTeodorStoica
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci-release.yml@3df6e527b5a431d847e53e92442eee204c5b7439 -
Trigger Event:
push
-
Statement type: