Jupyter server · Rust · no Python

The Jupyter server, without the Python.

Ganymede runs your kernels and serves the same API as jupyter_server, so JupyterLab and VS Code connect to it unchanged. It is one Rust binary, or a library to embed, and it needs no Python environment to run a TypeScript notebook, or any other.

For people who want Jupyter where a Python environment is a burden or impossible: TypeScript notebooks on cdp-kernel, CI jobs that run notebooks, and apps that embed a notebook server.

# Linux, macOS: latest release, plus cdp-kernel if Node 24+ is installed
curl -fsSL https://ganymede-server.com/install.sh | sh
ganymede kernelspec list

Linux and macOS are tested end to end. Windows binaries are built but not tested. Other ways to install

JupyterLab in a browser, served by ganymede lab, with a TypeScript notebook on the cdp-node kernel showing cell output.
JupyterLab from ganymede lab, running a TypeScript notebook on cdp-kernel.

Serve, then connect

ganymede serve prints a URL with its token. Paste it into VS Code's Existing Jupyter Server, or open JupyterLab's own bundle from it, and pick any kernel you have installed: cdp-node for TypeScript, python3 if ipykernel is there.

No server at all for scripts and CI: ganymede run sends code to a kernel and prints the output, and ganymede execute writes the same notebook jupyter execute would.

sh
$ ganymede serve --root-dir ~/notebooks
http://127.0.0.1:8888/?token=4f9c…

$ ganymede run -k cdp-node 'const x = 2; x * 21'
42

$ ganymede execute report.ipynb --inplace
One binary covers jupyter server, jupyter execute, jupyter kernel, and jupyter kernelspec.

Features

No Python runtime

The server, kernel host, notebook format, and executor are Rust, with no Python dependency. Python appears only as a kernel someone installed, as the reference CI compares against, and as the format the notebook writer matches. ganymede lab install unpacks JupyterLab's JavaScript from its PyPI wheel without running Python. Details

Any kernel

Kernels come from the standard kernelspecs in the Jupyter data directories. The host knows no language; the same tests run on cdp-kernel and ipykernel.

Existing frontends

The jupyter_server REST and websocket API, both websocket framings, and JupyterLab's /lab/api/* endpoints.

Parity with jupyter execute

Notebooks come out as nbclient writes them, and saves are byte-identical to Python's nbformat, so git sees no churn.

Embeddable

ganymede-engine is a library: start kernels, execute with streaming output, run notebooks. It builds for iOS, Android, and wasm.

Files as the source of truth

Atomic writes, modification-time conflict checks, and checkpoints outside the notebook folder, so synced folders such as iCloud Drive stay intact.

Where it fits

Ganymede takes jupyter_server's place and keeps both of its interfaces: the API above it and the kernels below.

Frontends (JupyterLab, Notebook 7, VS Code, and UIs of Ganymede's own) call the same REST and websocket API on the Rust core, which launches the same kernelspecs (cdp-kernel, ipykernel, any other) over ZeroMQ.
ClientHow it connectsStatus
VS CodeThe Jupyter extension's Existing Jupyter Server, with the URL and token.Works
@jupyterlab/servicesJupyterLab's client library: kernels, sessions, contents, interrupt, restart.Works
JupyterLabIts static bundle served by Ganymede at /lab, from ganymede lab.Works
Own UIA Swift shell with a web view on iPadOS and macOS, the core in-process.Planned

Connecting a frontend · Roadmap

Why

Nothing in the Jupyter protocols requires Python, but the server does: running a TypeScript notebook means installing a Python environment first. That rules out places Python can't easily go, such as an iPad app. Ganymede keeps the protocols and the ecosystem and drops the dependency.

Architecture · Replacing Python

Status

Early software. An end-to-end suite compares it against jupyter execute and jupyter server on cdp-kernel and ipykernel, on Linux and macOS. Windows builds but is not tested end to end. Known gaps