jupyterlab_galaxahub_motd_extension
Shows the GalaxaHub message of the day in a JupyterLab tab. When the lab starts, the extension pulls the welcome content that the user's groups carry and the broadcasts sent to the user. It opens a Message of the day tab when the hub has something to show, and stays silent when it has not.
Features
- Welcome tab on start - opens the Message of the day tab and makes it current when the hub carries at least one welcome entry or one notification for the user
- Silent without a hub - opens nothing and logs one console line when the hub has no motd extension, cannot be reached, or has nothing to show
- Two columns - the entry cards on the left, the Notifications column 380 px wide on the right; a tab narrower than 800 px stacks them
- One card per group - markdown rendered by the lab's own markdown renderer, an HTML package shown in a sandboxed iframe at its hub address, sized to fit its page
- Notifications catch-up - the broadcasts sent to all users and those naming the user, newest first, each marked by an icon in its type's colour, with the relative time and an all or direct marker
- Palette command -
Message of the day: Openreopens the one tab and pulls again - Token stays on the server - a server extension calls the hub with the lab's API token and passes Etags through, so the browser never holds the token and a repeated pull answers 304
Requirements
- JupyterLab >= 4.6
- A GalaxaHub hub carrying
galaxahub-motd-extension; without it the extension shows nothing
Install
pip install jupyterlab_galaxahub_motd_extension
Settings
| Setting | Default | Effect |
|---|---|---|
openOnStart |
true |
open the tab on lab start when the hub has something to show |
reopenOnBroadcast |
false |
reopen the tab when a live broadcast arrives through the notifications extension |
pollMinutes |
0 |
pull again on this interval while the tab is open; 0 never polls |
Server routes
The server extension proxies three hub reads under its own prefix and adds nothing to them. It
reads JUPYTERHUB_API_URL and JUPYTERHUB_API_TOKEN from the lab's environment.
| Route | Hub route |
|---|---|
GET /jupyterlab-galaxahub-motd-extension/terminal |
GET /hub/api/extensions/motd/terminal |
GET /jupyterlab-galaxahub-motd-extension/rich |
GET /hub/api/extensions/motd/rich |
GET /jupyterlab-galaxahub-motd-extension/notifications |
GET /hub/api/user-notifications |
- The hub's status, body,
Content-Type,EtagandCache-Controlpass through, and the browser'sIf-None-Matchgoes to the hub; a matching Etag answers 304 with no body - One answer for an absent hub - a hub 404 (no motd extension), a hub that cannot be reached,
and an unset
JUPYTERHUB_API_URLall answer204 No ContentwithCache-Control: no-cache; the server log states which of the three it was - Any other hub status, 403 included, passes through unchanged
- Hub side - docs/design-api.md states what a hub must answer on the three routes, for a developer who writes the hub side without GalaxaHub
Command line
The package installs jupyterlab-galaxahub-motd, which prints the same message of the day in a
lab terminal. It makes the three hub reads itself with JUPYTERHUB_API_URL and
JUPYTERHUB_API_TOKEN, which the hub sets for every lab, and needs no running Jupyter server.
jupyterlab-galaxahub-motd show # terminal text, rich entries, notifications
jupyterlab-galaxahub-motd notifications --json # one JSON document
jupyterlab-galaxahub-motd --help lists the commands, the environment variables and the exit
codes, and each command's --help carries examples.
The repository carries an agent skill,
.agents/skills/jupyterlab-galaxahub-motd-extension/SKILL.md.
Agents that read .agents/skills find it in a clone of this repository; to make it available to
Claude Code everywhere, link it into the skills directory from the clone:
ln -s "$PWD/.agents/skills/jupyterlab-galaxahub-motd-extension" ~/.claude/skills/jupyterlab-galaxahub-motd-extension
Uninstall
pip uninstall jupyterlab_galaxahub_motd_extension
Metadata
Release files for jupyterlab-galaxahub-motd-extension 0.8.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jupyterlab_galaxahub_motd_extension-0.8.5.tar.gz | 268.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jupyterlab_galaxahub_motd_extension-0.8.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 325.4 kB
Release files / jupyterlab_galaxahub_motd_extension-0.8.5.tar.gz
| Download URL | jupyterlab_galaxahub_motd_extension-0.8.5.tar.gz |
|---|---|
| Size | 268.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c885128470dcc0302fc2cf2059c3790258b1c366d9b3e91ec5d5b0b3c9666566
|
|
BLAKE2b-256 checksum How to use checksums |
a83160d6fd9e42ae64dc0b1fb38946931c02bad0ed489ce58f573edb2513199e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / jupyterlab_galaxahub_motd_extension-0.8.5-py3-none-any.whl
| Download URL | jupyterlab_galaxahub_motd_extension-0.8.5-py3-none-any.whl |
|---|---|
| Size | 57.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ab0392403bf17cb11dd10c1bbac0a70480d4729474b86d3500954f5a9e6ae227
|
|
BLAKE2b-256 checksum How to use checksums |
7750d52811e3c226995cde817e3c6cdce099bc49c2fe61f306b96052a4d4bb2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|