Skip to main content
A notebook is a box running JupyterLab with your volumes, secrets and, if you ask, a GPU. It lives on the cluster, so a laptop closing does not stop a training cell, and its files sit on a volume that outlasts the box.

Create one

Notebooks → New notebook: a name, CPU and memory, a GPU or none, extra pip packages, secrets to attach, an idle timeout, and volumes to mount (each at /mnt/<name> by default). The notebook gets its own working folder on the notebooks volume, seeded with a getting-started notebook that runs end to end. The box takes about a minute to come up the first time.

Working in it

The notebook page is a native editor, not an iframe:
  • Cells with syntax highlighting, run with Shift-Enter, a run queue, outputs including images and tables, and autosave to the volume.
  • Kernel & compute in the rail: restart or interrupt the kernel, and the profile (CPU, memory, GPU, packages, secrets, idle timeout). Changing the profile relaunches the box with the new resources.
  • Resources · live: CPU, memory, GPU and disk meters from inside the box, updated every two seconds, with charts in the kernel panel.
  • Files: a browser of the working folder and mounted volumes, with preview, upload, new file or folder, and a right-click menu.
  • Box logs: what the JupyterLab process prints, for when a kernel refuses to start.
  • Connect to your apps: inside the box import levers9 works and the environment already carries the workspace token, so @job(...).remote() runs from a cell and deployed endpoints are reachable at their cluster URLs.
Open JupyterLab is still there if you want the full JupyterLab UI in a new tab.

Which outputs render

A notebook can come from anyone (a shared volume, a download, a colleague), so the editor treats every output as untrusted. Text, images, tables (a pandas DataFrame, and a Styler with its colours), markdown and sound render as they always did. SVG is shown as an image. HTML is cleaned first: scripts, event handlers and forms are dropped, and links open in a new tab. A frame in an output (a folium map, IPython.display.IFrame) still renders, sandboxed so that what runs inside it can’t reach the dashboard. Outputs that need their own scripts in the page, like plotly’s or bokeh’s notebook renderers, didn’t run here before and still don’t; open those in Open JupyterLab.

Who can reach it

A notebook is private to its workspace. Its box only answers on the workspace’s own route, with the workspace’s token, and the dashboard reaches it for you through /nb/<notebook>/ on the API. That route stays inside the notebook: a path that tries to step out of it (.., or an encoded slash) gets a 400, and file names with two dots in them, spaces or Arabic work as usual. Your session cookie never reaches the box, and the box can’t set a cookie on the dashboard’s domain. Your browser doesn’t need the notebook’s Jupyter token: the dashboard API adds it to every request it passes on to the box, for the notebook’s page and for JupyterLab in its own tab, and the list of notebooks never carries it. Jupyter keeps its own origin and XSRF checks on, and only accepts browsers from the dashboard’s addresses. A notebook made before this picks it up the next time it starts (Stop then Start, or after its idle timeout). A restart loses what’s in the kernel’s memory, so pick a quiet moment.

Stop and start

A notebook stops itself after the idle timeout, or from the list with Stop; Start brings it back with the same files, since everything is on the volume. Starting after a stop takes a bit over a minute.

Secrets and volumes inside

Each attached secret is an environment variable, os.environ["MY_SECRET"]. Attached volumes appear at their mount path; the notebooks volume itself is reserved and mounted for you.