Layered Jupyter container images and project-local JovyKit environments.
Project description
JovyKit
Project-local JupyterLab containers with a venv-like CLI, layered notebook images, uv-locked dependencies, and readable Docker Compose output.
.jovy is to JovyKit what .venv is to Python.
Website · Wiki · Issues · GHCR Images
Why JovyKit
JovyKit is for notebook-heavy data science and research projects that should be easy to start, reproducible later, and still inspectable when something needs debugging.
- Create a project-local
.jovy/environment from one command. - Track direct project packages in
jovy.toml. - Compile a deterministic
.jovy/jovy.lockwith uv. - Build a generated overlay image instead of mutating container state.
- Run JupyterLab through Docker Compose without making Compose the user interface.
- Choose notebook image layers from
minimal,base,extended, andfull. - Use a terminal dashboard for interactive project operations.
Install
Requirements
- Docker Engine and Docker Compose support
- Python 3.11+
Local install
Install from a local checkout:
python -m pip install -e .
Verify the CLI is available:
python -m pip install -e .
jovy --version
Quick Start
These commands are enough for your first environment:
jovy init .jovy --image base --gpus auto
jovy add pandas scikit-learn plotly
jovy install
jovy run
JovyKit prints the local JupyterLab URL. By default the token is jovykit.
Common workflows
Use these command groups when moving day-to-day:
Initialize + dependencies
jovy init .jovy --image base --gpus auto --port 8888
jovy add pandas scikit-learn
jovy remove plotly
jovy install
jovy add and jovy remove only update jovy.toml. jovy install is what
applies the manifest change to the generated overlay image.
Start, stop, and iterate
jovy run # foreground, logs streamed
jovy up # detached/background
jovy down # stop detached environment
jovy restart # rebuild if needed and restart
jovy status # quick health check
jovy start and jovy stop are aliases for jovy up and jovy down.
Work inside and clean up
jovy logs --tail 100 --since 10m --timestamps
jovy shell --command "python --version"
jovy exec python --version
jovy clean # remove generated state
jovy destroy --keep-image
When working outside the project directory, most commands accept --env PATH to
target a specific environment directory.
What JovyKit creates
jovy.toml
work/
.jovy/
jovy.lock
Containerfile
compose.yaml
state.json
jovy.toml is the project manifest. .jovy/ contains generated local
environment files and should stay out of version control.
Dashboard mode
Run jovy with no subcommand to open the terminal dashboard:
jovy
The dashboard is great for local, interactive operations. It supports command
entry, status refresh, log snapshots, and host shell escape (!pwd) commands.
jovy run and jovy logs are intentionally unavailable in the dashboard so
you can keep long-running sessions predictable.
Image Layers
Published images use this pattern:
ghcr.io/mihneateodorstoica/jovykit-TYPE:latest
ghcr.io/mihneateodorstoica/jovykit-TYPE:nightly
ghcr.io/mihneateodorstoica/jovykit-TYPE:lts
TYPE is one of:
minimal: Jupyter runtime plus the core scientific Python stack.base: everyday data science, classical machine learning, statistics, and local data access.extended: advanced ML, NLP, time series, distributed compute, and API tooling.full: heavier AI, graph, geospatial, big-data, and research tooling.
All image variants include git, OpenSSH client tools, rsync, and a prepared
~/.ssh directory for SSH-backed remotes and file sync.
Build a target locally:
docker build --target minimal -t jovykit-minimal ./image
docker build --target base -t jovykit-base ./image
docker build --target extended -t jovykit-extended ./image
docker build --target full -t jovykit-full ./image
Configuration
jovy.toml can customize runtime environment variables, extra volumes, home and
work mounts, restart policy, Jupyter command/logging, Compose Watch behavior,
image build arguments, build target/platform, apt packages, and uv/pip install
options.
JovyKit mounts .jovy/home/ as /home/jovyan by default. Normal clean and
destroy runs preserve that folder, so SSH config, Jupyter config, shell
history, and other dotfiles are not thrown away by routine lifecycle commands.
Use jovy destroy --purge when you intentionally want to delete the persisted
home data.
Use the arrow-key editor:
jovy config
or open the dashboard and run:
config
Textual config editor keys:
up/downmove between fieldsleft/rightcycle boolean and choice valuesenteredits or confirms a fieldwsave in place and keep the editor openq/escapecancel (with discard confirmation when unsaved)
Testing and contribution checks
Stable check commands:
ruff check .
black --check .
mypy jovykit tests main.py
pytest --cov=jovykit --cov-report=term-missing --cov-fail-under=90
Docker-oriented checks are intentionally opt-in:
pytest -m docker --run-docker
Repository layout
jovykit/ Python CLI package
image/ Dockerfile and layered image dependency manifests
site/ GitHub Pages promotional website
wiki/ GitHub Wiki page source
.github/workflows/ CI, security, website, wiki, and image automation
Documentation
The website promotes the project and lives in site/. Operational
documentation lives in the
GitHub Wiki, with source
pages in wiki/.
Troubleshooting
- If
jovysays "not a JovyKit project", runjovy initin the project root or pass--envto point at an existing.jovypath. - If Jupyter URL does not open, verify Docker is running and
jovy statusshowsrunning: true. - If dependency changes do not take effect, rerun
jovy installafter editingjovy.toml.
Contributing
Contributions are welcome. See CONTRIBUTING.md for the development workflow and CODE_OF_CONDUCT.md for community expectations.
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-5.2.0.tar.gz.
File metadata
- Download URL: jovykit-5.2.0.tar.gz
- Upload date:
- Size: 65.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
341d1d015d292779bea283a04bb5945823a6a0b8333f8d949724a74801902be8
|
|
| MD5 |
db2eb3de05ffae41cdcd67969577ff54
|
|
| BLAKE2b-256 |
3d4008f345da412e79c6daa4c978181884faafe7ef7bc8c12f3f5d2e1b0a89ce
|
Provenance
The following attestation bundles were made for jovykit-5.2.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-5.2.0.tar.gz -
Subject digest:
341d1d015d292779bea283a04bb5945823a6a0b8333f8d949724a74801902be8 - Sigstore transparency entry: 1469668647
- Sigstore integration time:
-
Permalink:
MihneaTeodorStoica/jovykit@e337199a6eeb9953922d003f68beab6777afab91 -
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@e337199a6eeb9953922d003f68beab6777afab91 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jovykit-5.2.0-py3-none-any.whl.
File metadata
- Download URL: jovykit-5.2.0-py3-none-any.whl
- Upload date:
- Size: 45.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9111a0bd33716c01967071de760a7470cd9f364e29ed6aba1ded54ae0d7846b9
|
|
| MD5 |
f5bc4abcb2a47037b645116324ad5d80
|
|
| BLAKE2b-256 |
d0670c3c11c8e99e46bbe200e529325e50c7866abdc12dc6970e664027609a32
|
Provenance
The following attestation bundles were made for jovykit-5.2.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-5.2.0-py3-none-any.whl -
Subject digest:
9111a0bd33716c01967071de760a7470cd9f364e29ed6aba1ded54ae0d7846b9 - Sigstore transparency entry: 1469668756
- Sigstore integration time:
-
Permalink:
MihneaTeodorStoica/jovykit@e337199a6eeb9953922d003f68beab6777afab91 -
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@e337199a6eeb9953922d003f68beab6777afab91 -
Trigger Event:
push
-
Statement type: