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.
Bundles a curated set of extensions, a path-first file browser, a VS Code-style git changes panel, an agent-focused launcher, and a quieter default workspace.
Install
pip install xtralab
Usage
As a JupyterLab package
Run JupyterLab the usual way:
jupyter lab
As a desktop app
A standalone Electron build (DMG on macOS, AppImage on Linux) ships with each
tagged release — grab the installer for your platform from the
Releases page. Builds from
the current main branch are also produced on every push as workflow
artifacts under the repository's
Actions tab. See
CONTRIBUTING.md for the architecture and local build
instructions.
What's included
ajlab— agent-ready JupyterLab base- JupyterLab 4.6+
jupyterlab-git— backs the bundled changes paneljupyterlab-lsp+ty— Python LSP via Astral'sty(bundled); also detectstypescript-language-serveronPATHfor JS/TSjupyterlab-quickopenjupyterlab-cursor-light,jupyterlab-cursor-darkjupyterlab-day,jupyterlab-nightthemes
The bundled labextension adds:
- A path-first file browser in the left sidebar.
- A "Source Control" panel powered by
jupyterlab-gitand@pierre/diffs. - An agent launcher with a prompt textarea, a row of agent buttons (Claude, Codex, Gemini, Copilot, Goose, OpenCode, Kiro, Mistral Vibe), and a collapsible list of changed files. Buttons are filtered to agents installed on the machine; a typed prompt is shell-quoted and spliced into the launch command for agents that accept one.
Language servers
xtralab ships with
jupyterlab-lsp and
pre-registers two language servers through
jupyter_server_config.d/xtralab-lsp.json:
-
Python —
ty— installed as a Python dependency. Works out of the box. -
TypeScript / JavaScript —
typescript-language-server— install yourself:npm install -g typescript-language-server typescript
Restart JupyterLab (or the desktop app) after installing.
Specs use bare command names (["ty", "server"]), so binaries are resolved
from PATH at spawn time.
Where binaries are discovered
pip install xtralab— anything on the JupyterLab process'sPATH.- Desktop app — the supervisor augments
PATHwith common shim locations (~/.volta/bin,~/.npm-global/bin,~/.bun/bin,~/.asdf/shims,~/.mise/shims,/opt/homebrew/bin,/usr/local/bin, …). SetXTRALAB_EXTRA_PATH(colon-separated) before launching the app to add directories the defaults miss.
Adding more servers
To enable another server (bash, yaml, json, dockerfile, pyright, …),
install the binary then drop a JSON file into a jupyter_server_config.d/
directory:
pip install xtralab— runjupyter --pathsand pick a config dir (typically~/.jupyter/jupyter_server_config.d/).- Desktop app (macOS) —
~/Library/Application Support/xtralab/jupyter/config/jupyter_server_config.d/(orxtralab devfor local dev builds). - Desktop app (Linux AppImage) —
~/.config/xtralab/jupyter/config/jupyter_server_config.d/.
Example (bash-lsp.json):
{
"LanguageServerManager": {
"language_servers": {
"bash-language-server": {
"version": 2,
"argv": ["bash-language-server", "start"],
"languages": ["bash", "sh"],
"mime_types": ["text/x-sh", "application/x-sh"],
"display_name": "bash-language-server"
}
}
}
}
Pair with npm install -g bash-language-server. Reuse a bundled key to
override it. See
jupyterlab-lsp's docs
for the full spec schema.
Customizing the launcher
Open Settings → Settings Editor → xtralab launcher and edit the agents
array. Entries are merged with the defaults by id.
{
"agents": [
// Hide an agent
{ "id": "kiro", "enabled": false },
// Override an agent's command (e.g. point Claude at a shell alias)
{ "id": "claude", "command": "cl", "requireAvailable": false },
// Add a new agent; promptArgs: [] appends the prompt as a positional arg
{ "id": "aider", "label": "Aider", "command": "aider", "promptArgs": [] }
]
}
Fields: id (required), label, caption, command, promptArgs (how to
splice the prompt — [] for positional, ["--flag"] for flagged, null to
opt out), iconSvg, rank, enabled, requireAvailable.
Contributing
See CONTRIBUTING.md for the development setup, the Electron desktop app architecture, and the build pipeline.
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.3.0.tar.gz.
File metadata
- Download URL: xtralab-0.3.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 |
a38a7ddf2c617b38a381f9cf9b1ec444dfc8ecba5188329550a80f61bc9b842a
|
|
| MD5 |
e7b6a1fcae1f011063f227c1792ada69
|
|
| BLAKE2b-256 |
aadd7d4910f1739d3fe5e3f28b03f1d346e8a9c79b1653da8573e30fab4d348c
|
File details
Details for the file xtralab-0.3.0-py3-none-any.whl.
File metadata
- Download URL: xtralab-0.3.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 |
d7c73854e8f25510eb9c72d77f4a5c80a78bd3a555774c24a198689d83ced368
|
|
| MD5 |
e7d45d2524b4002c84035aa14c64539f
|
|
| BLAKE2b-256 |
a6d8625ea506565f76a4f6f37c88ff8d7d0f2dc4d5d5c2da021b22111457faeb
|