{
 "slug": "jupyterhub",
 "name": "JupyterHub",
 "tagline": "Multi-user notebook server for data science teams",
 "category": "developer-platform",
 "use_cases": [
  "notebooks",
  "data-science",
  "jupyterlab"
 ],
 "aliases": [
  "jupyter"
 ],
 "status": "live",
 "upstream": {
  "vendor": "Project Jupyter",
  "url": "https://jupyter.org/hub",
  "license": "BSD-3-Clause",
  "license_url": "https://github.com/jupyterhub/jupyterhub/blob/main/LICENSE"
 },
 "image": {
  "os": "Ubuntu 24.04 LTS",
  "cis_level": 1,
  "ports": [
   443
  ],
  "artifacts": [
   "/etc/lynxroute/sbom.json",
   "/etc/lynxroute/cis-report.html",
   "/usr/share/doc/lynxroute/CIS_TAILORED_PROFILE.md"
  ]
 },
 "clouds": {
  "aws": {
   "status": "restricted",
   "restricted_on": "2026-08-24"
  },
  "azure": {
   "status": "live",
   "version": "5.5.2",
   "last_build": "2026-09-07",
   "offer_id": "jupyterhub",
   "plan_id": "payg-gen2",
   "image_urn": "lynxroute:jupyterhub:payg-gen2:latest",
   "listing_url": "https://azuremarketplace.microsoft.com/en-us/marketplace/apps/lynxroute.jupyterhub?tab=Overview",
   "recommended_vm_size": "Standard_D2s_v3",
   "price_usd_per_vcpu_hour": 0.028,
   "unit": "vcpu-hour"
  },
  "alicloud": {
   "status": "not_offered"
  }
 },
 "urls": {
  "page": "https://lynxroute.com/products/jupyterhub/",
  "json": "https://lynxroute.com/products/jupyterhub/product.json"
 },
 "release_notes": [
  {
   "version": "5.5.1",
   "title": "JupyterHub 5.5.1 - patch update from 5.5.0. Fixes an invalid-UTF-8 JSON request body returning HTTP 500 instead of HTTP 400, and avoids a traceback when write_error is called before prepare; includes an npm audit fix for the bundled frontend assets. CIS Level 1 hardened Ubuntu 24.04 LTS; PAM authentication + systemdspawner per-user isolation; host nginx TLS on 443 with the Hub bound to loopback; one-command HTTPS via Certbot; SBOM (CycloneDX 1.6) and CIS Conformance Report included.",
   "notes": "",
   "source": "backfill-aws-listing",
   "live": {
    "azure": "2026-08-19"
   }
  },
  {
   "version": "5.5.0",
   "title": "JupyterHub 5.5.0",
   "notes": "* JupyterHub 5.5.0 on Ubuntu 24.04 LTS\n* CIS Level 1 hardening applied (ansible-lockdown/UBUNTU24-CIS)\n* CVE-scanned before every release\n* PAM authentication; admin user with a password generated at first boot\n* systemdspawner - per-user notebook servers isolated in systemd cgroups\n* Host nginx terminates TLS on port 443; Hub bound to 127.0.0.1:8000 (loopback)\n* One-command HTTPS via Certbot (certbot --nginx)\n* UFW firewall pre-configured (ports 22, 443 only)\n* fail2ban, auditd, AppArmor pre-configured\n* SBOM (CycloneDX 1.6) at /etc/lynxroute/sbom.json\n* CIS Conformance Report (OpenSCAP) at /etc/lynxroute/cis-report.html\n* IMDSv2 enforced\n",
   "source": "backfill-aws-api",
   "live": {}
  }
 ],
 "release_history": [
  {
   "version": "5.5.2",
   "azure": "2026-09-07"
  },
  {
   "version": "5.5.1",
   "azure": "2026-08-19"
  }
 ],
 "deploy": {
  "azure_cli": "# accept the plan terms once, then:\naz vm image terms accept --publisher lynxroute --offer jupyterhub --plan payg-gen2\naz vm create -g my-rg -n jupyterhub --size Standard_D2s_v3 \\\n  --image lynxroute:jupyterhub:payg-gen2:latest --admin-username azureuser --generate-ssh-keys"
 },
 "description": {
  "what_is": "JupyterHub is a multi-user server for Jupyter notebooks: it gives each user their own, independent JupyterLab notebook server behind a single entry point. This build runs the Hub as a Python application (JupyterHub 5.5.0 with the JupyterLab 7 single-user server) and uses systemdspawner to launch every user's server inside its own systemd unit with cgroup isolation. Authentication is PAM, so users log in with their real Linux account password - no external identity provider required. The public-facing proxy (configurable-http-proxy) is bound to loopback and fronted by nginx for TLS. Per-user notebooks, kernels, and files persist on the instance disk. BSD-3-Clause license, no vendor lock-in. Self-hosted on your own EC2 instance, your notebooks and data never leave your AWS account.",
  "image_adds": "Security hardening:\n* PAM authentication; an admin user with a strong password generated at first boot (written to /root/jupyterhub-credentials.txt)\n* Login restricted to an explicit allow-list - new users are added deliberately, not open by default\n* Each user's notebook server runs in its own systemd cgroup (systemdspawner) with a private temp directory\n* The Hub and its proxy bind to 127.0.0.1 only; host nginx terminates TLS on port 443\n* One-command HTTPS: certbot --nginx (Certbot and the nginx plugin are pre-installed)\n* UFW firewall pre-configured (ports 22 and 443 only)\n* fail2ban, auditd, AppArmor pre-configured\n* CVE scan - every image is scanned for vulnerabilities before release\n\nOS hardening (CIS Level 1):\n* CIS Ubuntu 24.04 LTS Level 1 benchmark applied via ansible-lockdown\n* auditd, SSH hardening, Kernel hardening, IMDSv2 enforced\n\nCompliance artifacts:\n* SBOM - CycloneDX 1.6 at /etc/lynxroute/sbom.json\n* CIS Conformance Report at /etc/lynxroute/cis-report.html\n* CIS Tailored Profile at /usr/share/doc/lynxroute/CIS_TAILORED_PROFILE.md"
 },
 "generated_at": "2026-10-31T09:36:34Z"
}
