Switching from jupyter_server
Ganymede replaces the server, not the kernels. If you run jupyter lab today, your Python notebooks keep running on ipykernel, with pandas, matplotlib and the rest of your environment, once ipykernel's kernelspec is installed. What changes is the process between the frontend and the kernel: one binary instead of a Python environment with jupyter_server, jupyter_client, nbformat and traitlets in it.
This page lists what carries over, what is different, and what is missing, so you can judge the switch before making it.
What carries over
| Notebooks | The same .ipynb files. Saves match Python's nbformat byte for byte, so they don't churn in git. |
| Kernels | Every installed kernelspec in the Jupyter data dirs and $JUPYTER_PATH, ipykernel's included. |
| Trust | The same notebook_secret and nbsignatures.db: a notebook trusted in Jupyter is trusted here. |
| Logins | The same jupyter_cookie_secret, so a browser stays logged in. |
| JupyterLab settings | ~/.jupyter/lab/user-settings/ and workspaces/. |
| Clients | JupyterLab, VS Code's Jupyter extension, and other clients of the REST and websocket API. See JupyterLab and VS Code. |
| Headless runs | ganymede execute writes the same outputs as jupyter execute; ganymede trust replaces jupyter trust. |
What is different
Installing JupyterLab.
ganymede lab installdownloads JupyterLab's browser files from PyPI without running Python, instead ofpip install jupyterlab. Prebuilt extensions install withganymede lab extension install <package>.Kernels in an environment.
jupyter_clientalso finds kernels under the Python environment it runs in (sys.prefix). Ganymede has no Python environment, so a kernel installed into a virtualenv or conda environment needs that prefix added:--kernelspec-root "$VIRTUAL_ENV/share/jupyter". A kernel installed with--user, aspython -m ipykernel install --userdoes, is found as it is.The default kernel is
--default-kernel, or else the first kernelspec found, notpython3.Configuration is one TOML file instead of
jupyter_server_config.py(CLI and configuration). The settings that carry over:jupyter_serverganymede.tomlServerApp.ip,ServerApp.portip,portIdentityProvider.tokentokenServerApp.root_dirroot_dirServerApp.base_urlbase_urlServerApp.allow_originallow_origins(a list)ServerApp.allow_credentialsallow_credentialsServerApp.allow_remote_access,ServerApp.local_hostnamesallow_remote_access,local_hostnamesServerApp.trust_xheaderstrust_xheadersServerApp.cookie_secret_filecookie_secret_fileServerApp.max_body_sizemax_body_sizeMappingKernelManager.default_kernel_namedefault_kernelMappingKernelManager.cull_idle_timeoutcull_idle_secsKernelRestarter.restart_limitkernel_restart_limitFileCheckpoints.checkpoint_dircheckpoint_dirNotebookNotary.data_dirnotary_dirGatewayClient.url,GatewayClient.auth_tokengateway_url,gateway_tokenOther settings have no equivalent. An unknown key in the file is an error, so a setting that doesn't carry over can't be ignored silently.
What is missing
Server extensions (the Python half of some JupyterLab extensions), nbconvert's template exports (HTML, PDF, LaTeX, slides; script and Markdown work), and JupyterHub's single-user mode. Terminals and language servers (JupyterLab and VS Code) and real-time collaboration (Live editing and document rooms) do work, with no Python behind them. Known gaps has the full list and the details. If you depend on one of these, stay on jupyter_server for now, or run it for that one job: both servers share kernels, notebooks and signatures, so they can run side by side.
TypeScript notebooks
Ganymede was built for TypeScript notebooks with cdp-kernel, with no Python installed at all. The JavaScript ecosystem for data work is smaller than Python's, and there is no single library with pandas' reach. If your work is pandas and matplotlib, keep it on ipykernel; Ganymede runs both kernels side by side, and you can move notebook by notebook.