Website profiles · Technology insights · Alternatives

jupyter-server.readthedocs.io

No paid content found
Visit website
Profile views 8 Outbound visits 2 Normal
Jupyter Server documentation Full homepage screenshot

At a glance

Category
Development
Language
English
Paid-content signal
No paid content foundObserved
Registered
2014
Hosting
CloudflareInferred
HTTPS certificate trusted
PassedObserved
Last updated

Website review

This review may include AI-generated content and is not individually verified. Domain, certificate and other facts come from the observed data on this page.

What is Jupyter Server?

Jupyter Server is the backend that supplies the core services, APIs, and REST endpoints that Jupyter web applications run on. It is not a notebook interface itself: it is the layer beneath interfaces such as JupyterLab, Notebook, and NbClassic, handling the server-side work they depend on. The documentation describes it as a replacement for the Tornado web server previously embedded in Jupyter Notebook, and recommends that Jupyter web applications migrate to it.

What it does in practice

  • Serves the REST API and WebSocket kernel protocols that front ends use to run code, manage files, and talk to kernels.
  • Provides extension points, so applications and services can be built on its framework and services rather than reimplementing server plumbing.
  • Supports operational concerns such as configuration, logging, security, and running a public server.

Who it is for

The documentation splits its audience deliberately, which is a useful signal about the project's scope:

Audience Typical concern
Users Installing, configuring, and launching a server to use Jupyter applications
Operators Deploying to others, managing extensions, security, logging, migration from Notebook Server
Developers Writing server extensions and web applications against the API
Contributors Working directly on the Jupyter Server library

Extensions listed in the documentation illustrate the range: JupyterLab as a computational environment, Jupyter Scheduler for running notebooks as jobs, jupyter-collaboration for shared documents, and Cylc UI Server for monitoring workflows.

A concrete next step

If you are choosing where to start, decide by role. Using Jupyter applications as an end user, begin with installation and configuration rather than the API. Deploying for a team, read the operator material on managing extensions, security, and migration. Building on top of it, start with the architecture diagrams and the REST API before writing an extension. General documentation for the wider ecosystem is at Project Jupyter, and the source code and issue tracker are at GitHub.

How do I migrate from the classic Notebook Server to Jupyter Server?

Migration means swapping the backend that serves your Jupyter web application: Jupyter Server replaces the Tornado Web Server that shipped inside classic Jupyter Notebook. The front end you use (Notebook, JupyterLab, NbClassic) then runs on top of Jupyter Server instead of the old Notebook server.

The official path is documented under Migrating from Notebook Server in Jupyter Server documentation, which also covers running Jupyter Notebook on Jupyter Server. Treat that page as your primary checklist rather than improvising.

Decide what you are actually migrating

Situation What changes Typical approach
You just want to keep using the classic Notebook UI Backend only; the interface stays familiar Run Notebook as a Jupyter Server extension (NbClassic is listed as an example extension)
You are deploying for other people Server configuration, extensions, security and logging settings Follow the Operators section: managing extensions, configuring extensions, running a public server, security, logging
You are building a custom web app or extension You target Jupyter Server's REST API and extension framework Follow the Developers section: architecture diagrams, REST API, server extensions, contents API, file save hooks
You contribute to the library itself Development setup and team processes Follow the Contributors section

Practical migration steps

  1. Identify every Notebook Server configuration file, startup script, and custom extension in your current deployment. Extensions are the usual source of breakage, because they must be compatible with Jupyter Server's framework rather than the old Notebook server.
  2. Install Jupyter Server and, if you still need the classic interface, the extension that provides it.
  3. Port your settings into Jupyter Server configuration, checking the "Configuring a Jupyter Server" and "Configuring Extensions" pages rather than copying old config blindly.
  4. Re-check security and authentication settings before exposing anything publicly — the docs separate "Security in the Jupyter Server" from "Security in notebook documents," and both matter.
  5. Test with a bare server launch first ("Launching a bare Jupyter Server"), then add extensions one at a time so you can attribute failures.

A concrete scenario

Suppose you run a shared Notebook Server for a small team, with two custom extensions: one for resource monitoring and one for scheduled notebook runs. Before migrating, confirm each extension has a Jupyter Server–compatible version. The documentation lists Jupyter Resource Usage and Jupyter Scheduler as examples of Jupyter Server extensions, so those categories of functionality exist in the new model — but your specific extension still needs to be updated or replaced. After migrating, verify that authentication, file access paths, and kernel connectivity behave the same for your users, since those are the areas where a backend swap shows up first.

Next step

Open the "Migrating from Notebook Server" page in Jupyter Server documentation and work through it alongside the Operators pages for your deployment. If your setup is a plain local install, the Users section (installation, configuration, launching a bare server) is enough. If you maintain extensions, read the Developers section before you start, because extension compatibility usually determines how long the migration takes.

What steps are needed to run a public Jupyter Server securely?

Running a public Jupyter Server securely means treating it as an internet-facing service, not a local notebook. You need authentication, TLS, network controls, and a clear decision about who can reach the server.

Minimum steps

  1. Decide whether it must be public at all. If a VPN, SSH tunnel, or reverse proxy with IP allowlisting can serve your users, prefer that. Public exposure increases the attack surface and makes every configuration mistake more dangerous.
  2. Enable authentication. Jupyter Server ships with token-based authentication by default, and you can configure a password instead. Never disable authentication on a public server. Create a strong token or password and store it outside the repository.
  3. Terminate TLS. Place the server behind a reverse proxy such as Nginx, Caddy, or Apache with a valid certificate, or configure TLS directly. Without HTTPS, tokens and notebook contents travel in cleartext.
  4. Bind to a controlled interface. Bind the server to 127.0.0.1 and let the proxy handle external traffic. This prevents direct access to the backend port.
  5. Restrict origins and headers. Set allowed origins to your real domain, and configure the proxy to forward only the headers you need. This reduces cross-site request risks.
  6. Harden the proxy. Add rate limiting, request size limits, and timeouts. Block unnecessary paths and methods.
  7. Isolate users and processes. Run the server as a dedicated non-root user. If multiple users share the server, separate them into containers or separate server instances rather than sharing one process.
  8. Limit extensions. Install only extensions you trust. Each extension runs with the server's privileges and can expose new endpoints.
  9. Log and monitor. Enable logging and watch for repeated authentication failures, unexpected restarts, and unusual kernel activity.
  10. Keep it patched. Track releases of Jupyter Server and any extensions, and update promptly.

A useful mental model

Layer What it protects Typical control
Network Who can reach the port VPN, firewall, allowlist
Transport Data in transit TLS via reverse proxy
Authentication Who can log in Token or password
Authorization What a logged-in user can do Per-user instances, extension limits
Process Blast radius of a compromise Non-root user, containers
Operations Detecting and responding Logs, monitoring, patching

Next step

Start from the server's own guidance on running a public server and on security, then map each item above to a concrete setting in your deployment. If you are migrating from the classic Notebook server, follow the migration guidance rather than copying old configuration blindly. The official documentation is at Jupyter Server documentation, and the project's source and issue tracker are at GitHub.

A practical test: from an outside network, confirm the server is unreachable without authentication, that HTTP redirects to HTTPS, and that a wrong token is rejected. Repeat this check after every configuration change.

How do I install and launch a bare Jupyter Server?

Install the jupyter-server package, then start it from a terminal with the jupyter server command. Because a "bare" server has no notebook or lab front end bundled in, you get the backend services and REST API without the usual browser interface — useful when you're building or testing your own front end, or when you want to inspect the API directly.

Install

pip install jupyter-server

Conda users can install from conda-forge instead:

conda install -c conda-forge jupyter-server

Installing into a virtual environment or a dedicated conda environment keeps the server's dependencies separate from other Jupyter front ends you may have installed.

Launch

jupyter server

The server prints a URL containing a token, something like http://localhost:8888/?token=.... Open that URL to reach the server's API landing page. If you only want the API and not a browser, you can copy the token and use it in requests, for example curl -H "Authorization: token <token>" http://localhost:8888/api/contents.

Useful options when launching:

  • --port 8889 — run on a different port if 8888 is taken.
  • --no-browser — don't try to open a browser automatically, handy on a remote machine.
  • --ServerApp.token='' — disable token authentication. Only appropriate on a trusted single-user machine; never on a shared or public host.
  • --allow-root — required if you're running as root, though running as root is discouraged.

What you actually get

A bare server exposes the core services and REST endpoints that Jupyter web applications build on — contents, kernels, sessions, terminals and the websocket kernel protocol. There is no notebook editor or file browser UI. To see something in a browser you either point an existing front end at it, or write against the API.

Choosing between this and a full front end

Goal Bare Jupyter Server Notebook or JupyterLab
Call the REST API directly Yes, this is the point Possible but heavier
Develop a custom front end Yes Awkward
Edit and run notebooks in a browser No UI included Yes
Minimal dependency footprint Smaller Larger

If your goal is simply to write and run notebooks interactively, install Project Jupyter's Notebook or JupyterLab instead — both run on top of Jupyter Server and give you the interface. Reach for the bare server when you're integrating, scripting or extending.

Next step: once it's running, fetch http://localhost:8888/api with your token to list the available endpoints, which is the quickest way to confirm the server is healthy and see what it offers.

How do I write a Jupyter Server extension?

Start with the Server Extensions section of the Jupyter Server documentation, since that is the page written specifically for the developer persona. Jupyter Server is the backend that provides core services, APIs and REST endpoints for Jupyter web applications, and extensions are how you add your own endpoints, services or behavior on top of it.

Jupyter Server documentation

What "writing an extension" actually means

You are building a Python package that Jupyter Server discovers and loads at startup. A minimal extension typically does three things:

  • Declares one or more handler classes that respond to HTTP requests, using the REST API surfaces Jupyter Server already exposes.
  • Registers those handlers through the extension's _load_jupyter_server_extension entry point so the server wires them into its routing.
  • Ships package metadata that advertises the extension, so jupyter server extension enable and the server's config system can find it.

The documentation's developer track also covers architecture diagrams, depending on Jupyter Server as a library, the REST API, file save hooks, the contents API, and the WebSocket kernel wire protocol. Those pages matter once your extension needs to touch notebooks, files or kernels rather than just serve its own routes.

A concrete first project

Suppose you want an endpoint that reports which notebooks were modified in the last hour. You would write a handler subclassing Jupyter Server's base handler, return JSON from its get method, and register it under a path such as /myorg/recent. You then install the package into the same environment as the server and restart it. If the route does not appear, the usual causes are a missing entry point, the extension not being enabled, or the server running from a different environment than the one you installed into.

Choosing between extension styles

Goal Approach Trade-off
Add HTTP endpoints or services Server extension Full control, but you own routing, auth and lifecycle
Change the notebook UI only Frontend extension (for example in JupyterLab) Lighter backend work, but tied to that frontend
Reuse existing notebook behavior Depend on Jupyter Server as a library Less code, but you inherit its version constraints

Note that Jupyter Server replaced the Tornado Web Server in Jupyter Notebook, and the documentation points to a migration page for projects still built the old way. If you maintain an older Notebook server extension, plan that migration rather than copying old patterns.

Who should read which part

The docs split audiences deliberately: users for installation and launching, operators for deploying, configuring extensions and running a public server securely, and developers for extensions and the REST API. For extension work, stay in the developer section and treat the operator pages on security and logging as required reading before you expose anything beyond localhost.

Next step

Read the Server Extensions page end to end, then look at a small real extension to see the entry-point wiring in context. JupyterLab and NbClassic are both described as Jupyter Server extensions, so their source is a practical reference for structure, even though they are far larger than a first extension needs to be.

How does Jupyter Server differ from the Tornado Web Server in Jupyter Notebook?

Jupyter Server is the newer backend that provides the core services, APIs, and REST endpoints for Jupyter web applications. It replaces the Tornado Web Server that was embedded in the classic Jupyter Notebook, and Jupyter web applications are expected to migrate to it. In practice, that means the server layer is now a standalone project you run, configure, and extend, rather than a piece of the Notebook application itself.

What changes for you

The most visible difference is architectural. With the old Notebook server, the web server and the notebook application were tightly coupled. With Jupyter Server, the server is a separate foundation that frontends and extensions build on. JupyterLab, for example, runs on Jupyter Server, and NbClassic packages the classic notebook experience as a Jupyter Server extension.

That separation matters most when you want more than one interface or capability in the same server process. Extensions can add applications and services, such as a resource-usage monitor, a notebook job scheduler, or collaborative document support, without each one shipping its own web server.

Who notices the difference

  • Users mostly see continuity: the same notebooks and interfaces, now served by a different backend. Problems usually appear as configuration or extension compatibility issues rather than day-to-day changes.
  • Operators gain a single server to deploy and configure, but must handle extension management and the migration path from the Notebook server. Security, logging, and public-server configuration are documented separately for this reason.
  • Developers get a documented REST API, server-extension framework, file save hooks, contents API, and WebSocket kernel protocols to build against, instead of modifying the Notebook server directly.
  • Contributors work on one server library rather than the server code inside Notebook.

A practical next step

If you maintain a deployment or an extension that targets the old Notebook server, check whether it depends on Notebook-specific server internals. The migration guidance for moving from the Notebook server is the natural starting point, followed by the server-extension documentation if you are writing or updating extensions. For background on the surrounding projects, see Project Jupyter and JupyterLab documentation.

Related questions

More questions →
What Is Jupyter Server and How Does It Relate to Jupyter Notebook and JupyterLab?

Jupyter Server is the backend that provides the core services, APIs, and REST endpoints for Jupyter web applications. It is a replacement for the Tornado Web Server that was previously embedded in Jupyter Notebook, and JupyterLab runs on top of it. If you are trying to understand the Jupyter stack — or you are migrating from the classic Notebook server — the key idea is that Jupyter Server is the shared foundation, while Notebook and JupyterLab are frontends or applications built on that foundation.

The three layers, separated

The Jupyter documentation describes Jupyter Server as "a highly technical piece of the Jupyter Stack," which is why its docs are split by persona (Users, Operators, Developers, Contributors). The relationship between the projects is easiest to see as a stack:

Layer Project Role
Application / frontend JupyterLab, NbClassic, other extensions The interface and features you interact with
Backend Jupyter Server Core services, APIs, REST endpoints
Legacy backend Tornado Web Server (in Jupyter Notebook) The server Jupyter Server replaces

So JupyterLab is not a competitor to Jupyter Server — it is an application that runs on it. The documentation lists JupyterLab first among examples of Jupyter Server extensions, alongside Jupyter Resource Usage, Jupyter Scheduler, jupyter-collaboration, NbClassic, and Cylc UI Server.

What "replacement for Tornado Web Server" actually means

In the classic Jupyter Notebook, the web server logic and the notebook application were bundled together. Jupyter Server extracts that server layer into a standalone project. The documentation states plainly that Jupyter Server is a replacement for the Tornado Web Server in Jupyter Notebook, and that Jupyter web applications should move to using Jupyter Server.

The practical consequence: a single Jupyter Server can host multiple extensions and applications, rather than each application carrying its own server implementation. That is why the docs frame extensions as the primary way to build on Jupyter Server — they "use the framework and services provided by Jupyter Server to create applications and services."

How this affects you

The answer depends on which role you are in, since the documentation separates guidance by persona:

  • Users — people using Jupyter web applications. Relevant docs cover installation, configuring a Jupyter Server, and launching a bare Jupyter Server.
  • Operators — people deploying or serving Jupyter web applications to others. Relevant docs cover managing multiple extensions, configuring extensions, running a public Jupyter Server, security, and logging.
  • Developers — people writing Jupyter Server extensions and web applications. Relevant docs cover architecture diagrams, depending on Jupyter Server, the REST API, server extensions, file save hooks, the Contents API, and WebSocket kernel wire protocols.
  • Contributors — people contributing directly to the Jupyter Server library.

If you are migrating from the classic Notebook

The documentation provides a dedicated "Migrating from Notebook Server" page, and also covers "Running Jupyter Notebook on Jupyter Server." If your setup currently depends on the Notebook's built-in Tornado server, those two pages are the starting point rather than the general introduction.

Where to go next

The documentation's table of contents is organized so you can jump straight to your role rather than reading linearly. If you only need one thing from this page: Jupyter Server is the backend layer, JupyterLab and Notebook are applications on top of it, and the migration path from the old Notebook server is documented explicitly. If you find gaps in the docs, the project asks you to open an issue or a pull request on the Jupyter Server GitHub repo.

How the Jupyter Server Documentation Is Organized

The Jupyter Server documentation is split by role rather than by feature, so the fastest way to use it is to identify which of four personas you match: Users, Operators, Developers, or Contributors. Each section covers a different scope of work, and the same topic (for example, extensions) appears in more than one section with a different level of depth.

Users

This section is for people who run Jupyter web applications rather than build or deploy them for others. It covers:

  • Installation
  • Configuring a Jupyter Server
  • Launching a bare Jupyter Server
  • Getting Help

If your goal is to get a server running locally and adjust basic settings, this is the only section you need.

Operators

This section is for people deploying or serving Jupyter web applications to others. It covers:

  • Managing multiple extensions
  • Configuring Extensions
  • Migrating from Notebook Server
  • Running Jupyter Notebook on Jupyter Server
  • Running a public Jupyter Server
  • Security in the Jupyter Server
  • Security in notebook documents
  • Configuring Logging

The migration page matters if you are moving off the classic Notebook server: the documentation states that Jupyter Server is a replacement for the Tornado Web Server in Jupyter Notebook, and that Jupyter web applications should move to using Jupyter Server.

Developers

This section is for people writing Jupyter Server extensions and web applications. It covers:

  • Architecture Diagrams
  • Depending on Jupyter Server
  • The REST API
  • Server Extensions
  • File save hooks
  • Contents API
  • WebSocket kernel wire protocols
  • API Docs

The documentation describes Jupyter Server as the backend that provides the core services, APIs, and REST endpoints for Jupyter web applications, and notes that extensions can use its framework and services to build applications. Listed examples of such extensions include JupyterLab, Jupyter Resource Usage, Jupyter Scheduler, jupyter-collaboration, NbClassic, and Cylc UI Server.

Contributors

This section is for people contributing directly to the Jupyter Server library itself, and includes team and meeting information.

Choosing Your Entry Point

Your situation Start here
Installing and running a server for yourself Users
Deploying, securing, or migrating a shared server Operators
Building an extension or calling the REST API Developers
Working on the Jupyter Server codebase Contributors

One practical note from the documentation: if you find gaps, the project asks you to open an issue or a pull request on the Jupyter Server GitHub repo. The docs also point out that the GitHub repo holds the source code described in these pages, and that the classic Notebook and JupyterLab have their own separate repositories.

What Is the Jupyter Server Documentation Website?

jupyter-server.readthedocs.io is the official documentation site for the Jupyter Server Project. It is the right place to look if you need to understand, deploy, configure, or extend the backend that powers Jupyter web applications. If you are instead looking for the classic Notebook or JupyterLab source code, this site points you to their separate GitHub repositories rather than documenting them directly.

What Jupyter Server actually is

Jupyter Server is the backend that provides the core services, APIs, and REST endpoints for Jupyter web applications. In other words, it is the layer that handles requests from the browser and connects them to kernels, files, and other services.

The documentation notes that Jupyter Server is a replacement for the Tornado Web Server in Jupyter Notebook, and that Jupyter web applications should move to using Jupyter Server. If you are maintaining something built on the older Notebook server, the site includes a dedicated "Migrating from Notebook Server" page.

What the site covers

The documentation is organized around the tasks different people need to perform, not around a single linear tutorial. The main sections are:

  • Users — installation, configuring a Jupyter Server, launching a bare Jupyter Server, and getting help.
  • Operators — managing multiple extensions, configuring extensions, migrating from Notebook Server, running Jupyter Notebook on Jupyter Server, running a public Jupyter Server, security in the Jupyter Server, security in notebook documents, and configuring logging.
  • Developers — architecture diagrams, depending on Jupyter Server, the REST API, server extensions, file save hooks, the contents API, WebSocket kernel wire protocols, and API docs.
  • Contributors — team and meetings information.

Who the documentation is written for

The site explicitly separates its material by persona, because Jupyter Server is described as a highly technical piece of the Jupyter stack:

Persona What they are
Users People using Jupyter web applications
Operators People deploying or serving Jupyter web applications to others
Developers People writing Jupyter Server extensions and web applications
Contributors People contributing directly to the Jupyter Server library

Pick the section that matches your role; the same topic can appear differently depending on whether you are running a server or writing an extension for it.

What can be built on it

Jupyter Server extensions use the framework and services it provides to create applications and services. The documentation lists examples including JupyterLab, Jupyter Resource Usage, Jupyter Scheduler, jupyter-collaboration, NbClassic, and Cylc UI Server. If you are evaluating whether Jupyter Server fits your project, this list shows the range of things already built on it, from full computational environments to monitoring and workflow tools.

When this site is not what you want

The welcome page links out to other repositories you may have been looking for:

  • Jupyter Server GitHub Repo — the source code described in these docs.
  • Jupyter Notebook GitHub Repo — the source code for the classic Notebook.
  • JupyterLab GitHub Repo — the JupyterLab server, which runs on Jupyter Server.

If your question is about the Notebook or JupyterLab user interface rather than the backend services, APIs, and REST endpoints, start with those repositories instead. The documentation also invites you to open an issue or pull request on the Jupyter Server GitHub repo if you find gaps in the docs.

What Are Jupyter Server Extensions and What Applications Are Built on Jupyter Server?

Jupyter Server extensions are components that use the framework and services provided by Jupyter Server to create applications and services. According to the Jupyter Server documentation, examples include JupyterLab, Jupyter Resource Usage, Jupyter Scheduler, jupyter-collaboration, NbClassic, and Cylc UI Server. If you want to understand how the Jupyter ecosystem reuses one backend across different front ends, these extensions are the clearest illustration.

What Jupyter Server provides to extensions

Jupyter Server is the backend that provides the core services, APIs, and REST endpoints for Jupyter web applications. It is a replacement for the Tornado Web Server in Jupyter Notebook, and Jupyter web applications are expected to move to using Jupyter Server. The documentation points to a "Migrating from Notebook Server" page for help with that transition.

That backend role is what makes extensions possible: instead of each application rebuilding core services, an extension can build on the framework and services Jupyter Server already exposes.

Documented examples of Jupyter Server extensions

The documentation lists these extensions directly:

Extension What it is, per the documentation
JupyterLab The JupyterLab computational environment
Jupyter Resource Usage A Jupyter Notebook extension for monitoring your own resource usage
Jupyter Scheduler Runs Jupyter notebooks as jobs
jupyter-collaboration A Jupyter Server extension providing support for Y documents
NbClassic Jupyter notebook as a Jupyter Server extension
Cylc UI Server A Jupyter Server extension that serves the cylc-ui web application for monitoring and controlling Cylc workflows

Two patterns are worth noticing. Some entries are full applications in their own right (JupyterLab, NbClassic), while others add a specific capability on top of the server (resource monitoring, job scheduling, collaborative documents, workflow control). That range is the point: the same server foundation supports both.

Where to go for extension details

The documentation directs readers to the Server Extensions page for more information on extensions. That is the natural next stop if you are deciding whether to write an extension or need to know what the extension interface covers.

Who this documentation is written for

Jupyter Server is described as a highly technical piece of the Jupyter Stack, so the documentation is split by persona:

  • Users — people using Jupyter web applications
  • Operators — people deploying or serving Jupyter web applications to others
  • Developers — people writing Jupyter Server extensions and web applications
  • Contributors — people contributing directly to the Jupyter Server library

If you are evaluating extensions as a developer, the Developers track (architecture diagrams, depending on Jupyter Server, the REST API, server extensions, file save hooks, contents API, WebSocket kernel wire protocols, and API docs) is the relevant section. If you are deploying them, the Operators track covers managing multiple extensions, configuring extensions, migrating from Notebook Server, running a public server, security, and logging configuration.

The documentation also notes that gaps can be reported by opening an issue, or preferably a pull request, on the Jupyter Server GitHub repository.

Should I migrate from Notebook Server to Jupyter Server?

Yes, if you maintain a Jupyter web application or deployment built on the classic Notebook Server, the documentation states that Jupyter Server is a replacement for the Tornado Web Server in Jupyter Notebook, and that Jupyter web applications should move to using Jupyter Server. The migration guidance lives in the "Migrating from Notebook Server" page, with a companion page on "Running Jupyter Notebook on Jupyter Server" for those who still need the classic Notebook interface on top of the new backend.

What Jupyter Server actually is

Jupyter Server is the backend that provides the core services, APIs, and REST endpoints for Jupyter web applications. It is not a user-facing notebook interface — it is the layer that web applications sit on.

The documentation frames it explicitly as a replacement for the Tornado Web Server that was previously embedded in Jupyter Notebook. That framing is the whole reason migration is recommended: the older arrangement tied the server layer to the Notebook application, while Jupyter Server separates it so multiple front ends can share one backend.

Who should migrate

The documentation splits its audience into four personas, and the migration question lands differently for each:

Persona What they do Migration relevance
Users People using Jupyter web applications Indirect — you benefit when your tool's maintainers migrate
Operators People deploying or serving Jupyter web applications to others Direct — deployment and configuration change
Developers People writing Jupyter Server extensions and web applications Direct — this is the primary migration audience
Contributors People contributing directly to the Jupyter Server library Direct — you work in the new codebase

If you are an operator or developer running anything on the classic Notebook Server, the migration pages are written for you. If you are purely an end user clicking around a hosted notebook, the change is mostly invisible.

What runs on Jupyter Server

Migration is worth understanding because a large part of the ecosystem already builds on this backend. The documentation lists these as examples of Jupyter Server extensions:

  • JupyterLab — the computational environment
  • Jupyter Resource Usage — a Notebook extension for monitoring your own resource usage
  • Jupyter Scheduler — runs Jupyter notebooks as jobs
  • jupyter-collaboration — a Jupyter Server extension providing support for Y documents
  • NbClassic — Jupyter Notebook packaged as a Jupyter Server extension
  • Cylc UI Server — serves the cylc-ui web application for monitoring and controlling Cylc workflows

NbClassic is the notable one for migration planning: it shows that the classic Notebook experience can be delivered as an extension on top of Jupyter Server rather than as its own server.

Where to find the migration guidance

The documentation's table of contents places migration material under the Operators section, alongside related operational topics:

  • Migrating from Notebook Server — the main migration entry point
  • Running Jupyter Notebook on Jupyter Server — for keeping the classic Notebook interface
  • Managing multiple extensions and Configuring Extensions — relevant once you are on the new backend
  • Running a public Jupyter Server and Security in the Jupyter Server — deployment concerns that change with the new architecture

For developers, the corresponding material sits in the Developers section: Architecture Diagrams, Depending on Jupyter Server, The REST API, Server Extensions, File save hooks, Contents API, and WebSocket kernel wire protocols.

How to approach the migration

  1. Confirm what you are running. If your deployment is built on the Tornado Web Server inside Jupyter Notebook, you are in the migration scope described by the documentation.
  2. Read the "Migrating from Notebook Server" page first. It is the documentation's designated help entry for this transition.
  3. Decide whether you need the classic Notebook UI. If yes, the "Running Jupyter Notebook on Jupyter Server" page covers that path — NbClassic is the extension that provides it.
  4. Check your extensions. If you depend on extensions written for the old server, review the Server Extensions material and the extension management pages before switching.
  5. Review deployment and security. Operators should read the public server and security pages, since serving a Jupyter Server to others involves configuration that differs from the old setup.

Common sticking points

  • Assuming Jupyter Server is a notebook interface. It is a backend. If you expect a UI after migrating, you will need a front end such as JupyterLab or NbClassic on top of it.
  • Skipping the extension audit. Extensions are the main compatibility surface. The documentation's extension pages exist precisely because extensions are how applications plug into this backend.
  • Overlooking the operator documentation. Migration is filed under Operators in the table of contents, which signals that deployment and configuration work — not just code changes — is expected.

If you find gaps in the documentation during migration, the project asks you to open an issue or a pull request on the Jupyter Server GitHub repository.

Website Overview

An established domain and managed infrastructure suggest continuity of operations and may support dependable delivery, although neither guarantees service quality. Several search or sharing settings need attention. Together they may make snippets, preview images or preferred URLs less consistent across platforms.

Domain and Registration

Registered in 2014, this domain has about 12 years of history. That suggests continuity, although ownership and purpose may have changed. Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The registrar is Cloudflare, Inc, a widely used domain service provider. The domain uses the common .io extension, which is not an independent safety signal.

DNS and Email

MX records exist, but SPF, DKIM and DMARC were not detected. Protection against domain impersonation may be incomplete. Nameservers are provided by Cloudflare, indicating managed DNS hosting. MX records point to the Google Workspace email service. CAA records restrict which certificate authorities are authorized to issue certificates. No CNAME was found; the observed records resolve directly to addresses.

TLS and Certificates

The public key uses EC with 256 bits. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued within the Google Trust Services cloud or CDN ecosystem. The certificate's total validity is about 90 days, consistent with a short renewal cycle.

HTTP and Browser Security

The response lacks these common security headers: CSP, Permissions-Policy, clickjacking protection. CORS permits any origin to read this response. This is common for public resources; sensitive responses need narrower handling. No X-Powered-By header was found, reducing one common source of backend fingerprinting information. The cf-ray response header indicates a CDN or caching proxy in the delivery path. No obvious internal addresses or debug information were found in the headers.

Technology Stack Analysis

The public page identifies Cloudflare without precise versions, leaving fewer clues for version-specific scanning.

Search and Social Sharing

No homepage meta description was detected, leaving snippet selection more dependent on page text. No homepage canonical URL was detected. If duplicate URLs exist, consolidation may be less explicit. No Open Graph metadata was detected, so social previews may depend on platform inference. The title has 40 characters, within a common display range. The observed directives allow indexing and link following.

Hosting and Email

DNSCloudflare
HostingCloudflare
EmailGoogle Workspace
Approximate IP geolocation (inferred; a CDN or proxy may differ from the origin server) United States flagUnited States Inferred 2606:4700::6810:fd78

Registration details

RDAP / WHOIS

RegistrarCloudflare, Inc
Registered2014-06-14
Expires2028-06-14
Domain statusclientTransferProhibited https://icann.org/epp#clientTransferProhibited
Nameserversivan.ns.cloudflare.com、tegan.ns.cloudflare.com
DNSSECunsigned

DNS records

DNS

TypeNameValueTTLPriority
Ajupyter-server.readthedocs.io104.16.253.120300—
Ajupyter-server.readthedocs.io104.16.254.120300—
AAAAjupyter-server.readthedocs.io2606:4700::6810:fd78300—
AAAAjupyter-server.readthedocs.io2606:4700::6810:fe78300—
MXreadthedocs.ioaspmx.l.google.com3001
MXreadthedocs.ioalt1.aspmx.l.google.com3005
MXreadthedocs.ioalt2.aspmx.l.google.com3005
MXreadthedocs.ioaspmx2.googlemail.com30010
MXreadthedocs.ioaspmx3.googlemail.com30010
NSreadthedocs.ioivan.ns.cloudflare.com86400—
NSreadthedocs.iotegan.ns.cloudflare.com86400—
CAAreadthedocs.io0 issue " amazontrust.com"300—
CAAreadthedocs.io0 issue "comodoca.com"300—
CAAreadthedocs.io0 issue "digicert.com; cansignhttpexchanges=yes"300—
CAAreadthedocs.io0 issue "letsencrypt.org"300—
CAAreadthedocs.io0 issue "pki.goog; cansignhttpexchanges=yes"300—
CAAreadthedocs.io0 issue "ssl.com"300—
CAAreadthedocs.io0 issuewild "amazonaws.com"300—
CAAreadthedocs.io0 issuewild "comodoca.com"300—
CAAreadthedocs.io0 issuewild "digicert.com; cansignhttpexchanges=yes"300—
CAAreadthedocs.io0 issuewild "letsencrypt.org"300—
CAAreadthedocs.io0 issuewild "pki.goog; cansignhttpexchanges=yes"300—
CAAreadthedocs.io0 issuewild "ssl.com"300—

TLS and certificates

TLS / SSL

AssessmentNormal configuration
Supported protocolsTLSv1.2、TLSv1.3
Negotiated protocolTLSv1.3
Certificate subjectreadthedocs.io
IssuerGoogle Trust Services
Valid until2026-12-23T14:03 · Remaining when checked: 87 days
Verification detailsCertificate trust: Passed · Hostname match: Passed

HTTP response headers

HTTP

HeaderValue
content-typetext/html; charset=utf-8
cache-controlmax-age=1800, stale-if-error=86400, public
servercloudflare
strict-transport-securitymax-age=31536000; includeSubDomains; preload
x-content-type-optionsnosniff
referrer-policyno-referrer-when-downgrade
access-control-allow-origin*

Identified technologies

Cloudflare

Pages, Search and Sharing

Meta descriptionNot detected
Canonical URLNot detected
LanguageEnglish (default)
Twitter CardNot detected

Unknown

All bots 0 allowed · 0 disallowed

Recent Updates

  • Website images

User reviews (0)

  • No reviews yet.