{"id":886,"library":"jupyterlab-server","title":"JupyterLab Server Components","description":"jupyterlab-server provides a set of REST API handlers and utilities that serve as the backend components for JupyterLab and similar applications. It acts as an intermediary layer between JupyterLab and Jupyter Server, allowing for the creation of custom JupyterLab-like environments. The library maintains an active development pace with frequent updates, often on a monthly or bi-monthly release cycle.","status":"active","version":"2.28.0","language":"python","source_language":"en","source_url":"https://github.com/jupyterlab/jupyterlab_server","tags":["jupyter","jupyterlab","server","web","components","extension"],"install":[{"cmd":"pip install jupyterlab-server","lang":"bash","label":"Default Install"},{"cmd":"pip install jupyterlab-server[openapi]","lang":"bash","label":"With OpenAPI support"}],"dependencies":[{"reason":"Provides the core server application and base handler classes that jupyterlab-server builds upon.","package":"jupyter_server","optional":false}],"imports":[{"note":"While `JupyterHandler` might be available via `jupyter_server`, `LabHandler` is specific to `jupyterlab-server` and provides JupyterLab-specific functionality.","wrong":"from jupyterlab_server.server import JupyterHandler","symbol":"LabHandler","correct":"from jupyterlab_server.handlers import LabHandler"},{"note":"The main application class for programmatic interaction or configuration.","symbol":"ServerApp","correct":"from jupyterlab_server.server import ServerApp"},{"note":"Utility to register custom request handlers to the JupyterLab server.","symbol":"add_handlers","correct":"from jupyterlab_server.handlers import add_handlers"}],"quickstart":{"code":"import os\nfrom tornado import web\nfrom jupyterlab_server.server import ServerApp\nfrom jupyterlab_server.handlers import LabHandler\n\n# Define a simple custom handler\nclass MyCustomHandler(LabHandler):\n    @web.authenticated\n    def get(self, path=''):\n        self.finish(f\"Hello from My Custom Handler! Path: {path}\")\n\n# This function would typically be in a server extension module\n# (e.g., `my_extension.py`) and discovered by Jupyter Server.\ndef load_jupyter_server_extension(server_app: ServerApp):\n    host_pattern = \".*$\"\n    base_url = server_app.base_url\n    route_pattern = web.url(f\"/{os.environ.get('MY_CUSTOM_ROUTE_PREFIX', 'my-api')}(.*)\", MyCustomHandler)\n    server_app.web_app.add_handlers(host_pattern, [route_pattern])\n    server_app.log.info(f\"MyCustomHandler enabled at {base_url}my-api\")\n\n# To run this for testing, you'd integrate it with a Jupyter Server setup.\n# This block is illustrative and not a direct executable for end-users\n# as jupyterlab-server is a component library.\n# For a real setup, this would be loaded as a server extension.\n# Example command to launch JupyterLab with this extension:\n# jupyter lab --ServerApp.extra_static_paths='[\"$(pwd)\"]' \\\n#  --ServerApp.jpserver_extensions='{\"my_extension\": true}'\n\n# For testing purposes (not how it's usually run in production):\n# if __name__ == \"__main__\":\n#     from jupyter_server.serverapp import ServerApp as _JupyterServerApp\n#     class CustomLabServerApp(_JupyterServerApp):\n#         def initialize_settings(self):\n#             super().initialize_settings()\n#             load_jupyter_server_extension(self)\n#     CustomLabServerApp.launch_instance()","lang":"python","description":"This quickstart illustrates how to define and conceptually register a custom API handler using `jupyterlab-server` components. Typically, `jupyterlab-server` is extended within a larger Jupyter application (like JupyterLab) via a server extension. The `load_jupyter_server_extension` function is the entry point for such extensions, where custom Tornado `web.RequestHandler`s (here, `LabHandler`) are added to the server's web application."},"warnings":[{"fix":"Update `c.ServerApp.template_dir` to `c.ServerApp.templates_dir` in your Jupyter configuration files (e.g., `jupyter_jupyterlab_server_config.py`).","message":"In version 2.28.0, a typo was fixed in the default traitlet for the template directory, changing `template_dir` to `templates_dir`. Configurations explicitly overriding `template_dir` in earlier versions will need to be updated to `templates_dir` to maintain functionality.","severity":"breaking","affected_versions":">=2.28.0"},{"fix":"When using `jupyterlab-server`, understand its role as a building block. For end-user scenarios, typically install `jupyterlab` itself. For extensions, follow the Jupyter Server extension development guidelines.","message":"`jupyterlab-server` is primarily a component library providing backend services for JupyterLab and JupyterLab-like applications. It is not designed as a standalone end-user application. Direct programmatic use often involves extending its `ServerApp` or adding custom handlers within a larger Jupyter ecosystem context.","severity":"gotcha","affected_versions":"All versions"},{"fix":"Consult the `jupyter_server` migration guides for updating import paths and extension loading mechanisms. Use `jupyterlab_server` specific imports where available.","message":"When migrating server extensions from `notebook` (Classic Notebook) to `jupyter_server` (which `jupyterlab-server` builds upon), import paths for server modules may have changed. Code directly importing server components from the `notebook` package will need adjustment.","severity":"gotcha","affected_versions":"Primarily for users migrating from older Jupyter Notebook server extensions to Jupyter Server / JupyterLab Server."},{"fix":"Ensure `jupyter_server` is updated to at least version 2.0 when aiming to use Real-Time Collaboration with JupyterLab. Check `jupyterlab-server`'s `jupyter_server` dependency range for compatibility.","message":"JupyterLab v3.6 and later requires `jupyter_server v2.0` for Real-Time Collaboration features. While `jupyterlab-server` itself might support older `jupyter_server` versions for basic functionality, major new features in the ecosystem often mandate newer server versions.","severity":"deprecated","affected_versions":"For JupyterLab users using RTC with versions >=3.6"}],"env_vars":null,"last_verified":"2026-05-12T20:51:16.812Z","next_check":"2026-06-27T00:00:00.000Z","problems":[],"ecosystem":"pypi","meta_description":null,"install_score":85,"install_tag":"verified","quickstart_score":null,"quickstart_tag":null,"pypi_latest":"2.28.0","cli_name":"","cli_version":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","installed_version":"2.28.0","pypi_latest":"2.28.0","is_stale":false,"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.78,"mem_mb":47.5,"disk_size":"103.6M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.71,"mem_mb":47.4,"disk_size":"103.4M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.38,"mem_mb":47.5,"disk_size":"110.1M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.35,"mem_mb":47.4,"disk_size":"109.9M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9.6,"import_time_s":7.26,"mem_mb":47.5,"disk_size":"101M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":6.63,"mem_mb":47.4,"disk_size":"101M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":11.5,"import_time_s":7.35,"mem_mb":47.5,"disk_size":"107M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":6.97,"mem_mb":47.4,"disk_size":"107M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.13,"mem_mb":47.9,"disk_size":"111.8M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.61,"mem_mb":47.8,"disk_size":"111.6M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.18,"mem_mb":47.9,"disk_size":"119.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.58,"mem_mb":47.8,"disk_size":"119.0M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":10,"import_time_s":8.51,"mem_mb":47.9,"disk_size":"109M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":8.44,"mem_mb":47.8,"disk_size":"109M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":11.6,"import_time_s":8.42,"mem_mb":47.9,"disk_size":"117M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":8.38,"mem_mb":47.8,"disk_size":"116M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":8.99,"mem_mb":46.5,"disk_size":"102.1M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.48,"mem_mb":46.4,"disk_size":"101.9M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.06,"mem_mb":46.5,"disk_size":"109.4M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.35,"mem_mb":46.4,"disk_size":"109.1M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.3,"import_time_s":9.65,"mem_mb":46.5,"disk_size":"99M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.2,"mem_mb":46.4,"disk_size":"99M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9.8,"import_time_s":9.19,"mem_mb":46.5,"disk_size":"107M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.1,"mem_mb":46.4,"disk_size":"106M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":8.31,"mem_mb":48.8,"disk_size":"101.9M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":8.91,"mem_mb":48.7,"disk_size":"101.6M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":9.14,"mem_mb":48.6,"disk_size":"109.2M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.2,"mem_mb":48.5,"disk_size":"108.8M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":8.2,"import_time_s":8.66,"mem_mb":48.8,"disk_size":"99M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.99,"mem_mb":48.7,"disk_size":"99M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":9.5,"import_time_s":8.67,"mem_mb":48.6,"disk_size":"106M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.68,"mem_mb":48.5,"disk_size":"106M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":10.14,"mem_mb":48.3,"disk_size":"103.7M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":10.01,"mem_mb":48.4,"disk_size":"103.6M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":10.17,"mem_mb":48.3,"disk_size":"110.2M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":9.96,"mem_mb":48.4,"disk_size":"110.1M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":11.1,"import_time_s":9.57,"mem_mb":48.3,"disk_size":"101M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"jupyterlab-server","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":8.4,"mem_mb":48.4,"disk_size":"101M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":13,"import_time_s":9.24,"mem_mb":48.3,"disk_size":"108M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"openapi","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":8.82,"mem_mb":48.4,"disk_size":"107M"}]},"quickstart_checks":{"last_tested":"2026-04-24","tag":null,"tag_description":null,"results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}