jupyterlab_galaxahub_motd_extension {{version}}
This lab has no message of the day for you yet. The lab administrator sets it up; the rest of this page is for them.
On lab start the extension asks the hub for the welcome entries of the user's groups and the broadcasts sent to the user, and shows them in this tab: the entries as cards, the broadcasts in the Notifications column. When the hub gives no entry, the tab shows a local page instead: this page, until the lab config names another.
In jupyter_server_config.py or
jupyter_lab_config.py, for a GalaxaHub lab:
import os
hub = os.environ.get("JUPYTERHUB_API_URL", "")
if hub:
c.GalaxaHubMotd.motd_api_url = f"{hub}/extensions/motd"
c.GalaxaHubMotd.notifications_api_url = f"{hub}/user-notifications"
c.GalaxaHubMotd.fallback_html = "/opt/motd/index.html" # when the hub gives no entry
c.GalaxaHubMotd.label = "Message of the day" # the tab label
c.GalaxaHubMotd.open_on_start = True # False: no tab on lab start
With either URL empty the extension asks no hub. The files beside
fallback_html are served with it, so its images load; the
page runs no script.
In the Settings Editor, under Message of the day:
openOnStart (default true), reopenOnBroadcast
(default false), pollMinutes (default 0, never pulls again)
and notificationWindow (24h, 3d or 7d; default 24h).
The lab server calls these URLs with
Authorization: token <JUPYTERHUB_API_TOKEN>; the
browser never holds the token.
| URL | Answer |
|---|---|
GET <motd_api_url>/rich |
{"entries": [{"group", "kind": "markdown", "body"} or {"group", "kind": "html", "url"}]}
|
GET <motd_api_url>/terminal |
the terminal text, text/plain |
GET <notifications_api_url> |
{"notifications": [{"ts", "message", "type", "audience"}]}
|
A 404 on a URL means the hub has no motd extension. The full contract is docs/design-api.md.
jupyterlab-galaxahub-motd prints what the hub holds for the user in
a lab terminal, not this page; --help lists its commands.