An opinionated JupyterLab meta-package that bundles a curated set of extensions, ships a path-first file browser and a VS Code-style git changes panel, and applies a quieter default workspace configuration.
Project description
xtralab
An opinionated JupyterLab meta-package.
xtralab bundles a curated set of JupyterLab extensions, ships its own
JupyterLab extension with a path-first file browser and a VS Code-style git
changes panel, and applies a quieter default workspace configuration. The
defaults are shipped under etc/jupyter/labconfig and the bundled
labextension is shipped under share/jupyter/labextensions/xtralab.
The goal is to keep the package easy to inspect: most behavior comes from the
upstream Jupyter packages, while xtralab defines the default environment we
want out of the box.
Approach
The package brings together:
- The
ajlabmeta-package (agent-ready JupyterLab — collaboration plumbing, MCP support, command tooling, and its own quieter defaults) - JupyterLab 4.6+
- Git server integration (
jupyterlab-git— backs the bundled changes panel) - Quick file opening (
jupyterlab-quickopen) - Cursor styling helpers (
jupyterlab-cursor-light,jupyterlab-cursor-theme) - Day and night themes (
jupyterlab-day,jupyterlab-night)
These are installed as normal Python dependencies, so deployments can still override versions and Jupyter configuration in the usual ways.
Bundled labextension
xtralab ships its own prebuilt labextension that contributes:
- A path-first file browser in the left sidebar, built on
@pierre/trees. - A VS Code-style "Source Control" panel in the left sidebar, powered by the
jupyterlab-gitserver REST API and@pierre/diffs. The bundled@jupyterlab/gitfrontend is disabled automatically so the two panels do not coexist. - An agent-focused launcher that replaces the stock JupyterLab launcher.
The launcher tab shows an optional initial-prompt textarea, a row of
agent buttons (Claude, Codex, Gemini, Copilot, Goose, OpenCode, Kiro,
and Mistral Vibe), and a collapsible list of changed files (each
clickable into the diff viewer) below them. Clicking an agent opens a
fresh terminal and runs the agent's CLI; if the prompt textarea is
non-empty, the prompt is shell-quoted and spliced into the launch line
for agents that accept one. Agents are filtered by a
which-based availability check at activation, so only the ones actually installed on the machine show up.
Customizing the launcher
The launcher reads xtralab:launcher settings from the JupyterLab settings
registry. Open the Settings Editor (Settings → Settings Editor → xtralab launcher) and edit the agents array; xtralab merges your entries with
the defaults by id.
{
"agents": [
// Hide an agent you never want to see, even if it's installed:
{ "id": "kiro", "enabled": false },
// Override an agent's command — e.g. point Claude at a shell alias.
// `requireAvailable: false` keeps the card visible even though
// `which cl` returns nothing (interactive shells expand the alias).
{ "id": "claude", "command": "cl", "requireAvailable": false },
// Add a brand-new agent. `iconSvg` is optional; without it the card
// falls back to a generic terminal icon. `promptArgs: []` means the
// launcher's prompt textarea is appended as a positional argument.
{
"id": "aider",
"label": "Aider",
"command": "aider",
"promptArgs": []
}
]
}
Field reference (every field except id is optional):
| Field | Effect |
|---|---|
id |
Built-in id to override, or a new id to define a new card. |
label |
Card title. |
caption |
Subtitle shown beneath the title. |
command |
Literal text typed into the new terminal. |
iconSvg |
Inline SVG for the card icon (only needed for new agents). |
rank |
Sort order on the launcher; lower comes first. |
enabled |
false hides the card from the launcher and palette. |
requireAvailable |
false skips the which check (use for shell aliases that aren't on PATH but expand at runtime). |
promptArgs |
How to splice the launcher's optional prompt into the command. [] appends it as a positional argument (<command> 'PROMPT'); ["-i"] or ["--prompt"] puts it after a flag. Set to null to opt out — the agent button is dimmed when the prompt textarea is non-empty so a typed prompt is never silently dropped. Defaults vary per agent. |
Default settings
xtralab ships the following JupyterLab defaults:
- The announcements plugin is disabled, so JupyterLab does not prompt to fetch news from the Jupyter news feed and does not check for application updates.
- The Table of Contents, Debugger, and Notebook Tools panels are disabled so they do not show up in the right sidebar by default.
dockPanelPaddingis off, so the main dock area is flush with the surrounding chrome.- The terminal
fontFamilydefaults toMesloLGS NF, ui-monospace, monospaceso Powerline / Nerd Font glyphs (used by Oh My Zsh themes such aspowerlevel10k) render correctly when the font is installed; theui-monospace, monospacefallback keeps things readable when it is not.
The JupyterLab frontend defaults are shipped as labconfig/*.d/00-xtralab.json
fragments so downstream meta-packages can add their own Lab configuration
fragments without replacing xtralab's files.
Install
pip install xtralab
Run as a desktop app
xtralab ships a tiny launcher that opens JupyterLab in a dedicated Chrome
window (via Chrome's --app mode), with an isolated user-data directory so it
does not share cookies, extensions, or history with your normal browser.
Requires Chrome or Chromium installed. macOS only for now; other platforms will be added later.
The simplest way, no install needed:
uvx xtralab
Or, after pip install xtralab into an environment:
xtralab
The launcher starts a local Jupyter server on a random port with a fresh
token, waits for it to come up, opens the app window, and shuts the server
down when you close the window. Ctrl-C in the launching terminal also
shuts everything down cleanly.
Development
# Install dependencies and the package in editable mode
uv pip install -e ".[dev]"
jlpm
jlpm build
License
BSD-3-Clause
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file xtralab-0.2.0.tar.gz.
File metadata
- Download URL: xtralab-0.2.0.tar.gz
- Upload date:
- Size: 2.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b096fb026f83563c90278c6ea5aa861a403dfb44bc45ecbe2e3e256fc1ed0ee
|
|
| MD5 |
1d5e8bb344e9f51fd303be97c5765d51
|
|
| BLAKE2b-256 |
428b8742c4372d5696cf9cf051555f96841a4756c43d38107f34a12dc3c72c59
|
File details
Details for the file xtralab-0.2.0-py3-none-any.whl.
File metadata
- Download URL: xtralab-0.2.0-py3-none-any.whl
- Upload date:
- Size: 2.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d46454806eca6582d70450f92e7f844e4eaccd9bec2cf3f69595c754fe1b4582
|
|
| MD5 |
a98767b432db9738ba094e9bd2268413
|
|
| BLAKE2b-256 |
d823d97d4bd595d5ca3c2475b3cf87db09f6c113f4b3cfadd9d1c4949fa8bd5d
|