Skip to main content

An opinionated JupyterLab meta-package that bundles a curated set of extensions, ships a path-first file browser, renders jupyterlab-git's text, notebook and image diffs with its own viewers, 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, the jupyterlab-git panel with its text, notebook and image diffs rendered by xtralab, an agent-focused launcher, and a quieter default workspace.

xtralab screenshot

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 — provides the git panel; xtralab swaps its text, notebook and image diff rendering for its own
  • jupyterlab-lsp + ty — Python LSP via Astral's ty (bundled); also detects typescript-language-server on PATH for JS/TS
  • jupyterlab-quickopen
  • jupyterlab-cursor-light, jupyterlab-cursor-dark
  • jupyterlab-day, jupyterlab-night themes

The bundled labextension adds:

  • A path-first file browser in the left sidebar.
  • xtralab-rendered diffs registered as jupyterlab-git's diff providers (its own notebook/plain-text/image diff plugins are disabled) so the upstream git panel shows xtralab's diffs: @pierre/diffs for text and notebooks, and an <img>-based 2-up/swipe/onion-skin view for images.
  • 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's PATH.
  • Desktop app — the supervisor augments PATH with common shim locations (~/.volta/bin, ~/.npm-global/bin, ~/.bun/bin, ~/.asdf/shims, ~/.mise/shims, /opt/homebrew/bin, /usr/local/bin, …). Set XTRALAB_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 — run jupyter --paths and pick a config dir (typically ~/.jupyter/jupyter_server_config.d/).
  • Desktop app (macOS)~/Library/Application Support/xtralab/jupyter/config/jupyter_server_config.d/ (or xtralab dev for 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xtralab-0.5.0.tar.gz (2.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

xtralab-0.5.0-py3-none-any.whl (2.3 MB view details)

Uploaded Python 3

File details

Details for the file xtralab-0.5.0.tar.gz.

File metadata

  • Download URL: xtralab-0.5.0.tar.gz
  • Upload date:
  • Size: 2.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for xtralab-0.5.0.tar.gz
Algorithm Hash digest
SHA256 ee97d37704c1eddb72a6dc37d6e6cc2ec40c45450badddb543814463aa6eb1d6
MD5 685b8ac2bddf9fed0ddcb4b674f2506b
BLAKE2b-256 034f079254873a447dead0debc16cd8ecb7601a9a9339cc25dc16a71ba642d9b

See more details on using hashes here.

File details

Details for the file xtralab-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: xtralab-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for xtralab-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 bed247f20756e98f6750ff36485a30d822a2fa3d7a78529ae46bc680d06a8609
MD5 057aa62a55b81b374c3a1f7710b0753d
BLAKE2b-256 ca3f1f3f04d7a0a42e899d0d582422ac868e93588bae19115eb885c6bf12e7d2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page