# The Package Manager
URL: https://lsd.tools/docs/pkg-manager
Updated: 2026-07-18

> The desktop Package Manager lists packages filtered by In Project, Installed, or Store. The enable switch is a project-scoped freeze — a disabled package's nodes serve cached output and stop recomputing, without losing data. It also picks contribution variants, sets default packages, and adds packages from a URL.

The desktop **Package Manager** is where you turn packages on and off, install new ones, and pick
between contribution variants — all scoped to the current project.

## Filters: In Project, Installed, Store

The list is filtered by three tabs:

- **In Project** — packages active in the project you have open.
- **Installed** — everything available on this machine (pip entry-point packages, folders you added
 by reference, and the installed record).
- **Store** — the marketplace catalog, fetched on demand, showing what you own and what to buy.

## The enable switch is a project-scoped freeze

Toggling a package **off** does not uninstall it and does not lose data. It **freezes** the
package's nodes *for this project*: each disabled step serves its **cached output** and stops
recomputing. Nothing downstream recalculates through it.

```
# → disabled package's steps: STEP_SKIPPED (reason=package-disabled), cache intact
```

Toggle it back **on** and the real steps are restored (frozen placeholders swap back to the live
classes) and recompute as normal. Because disabling only freezes nodes, it is safe to flip while
you compare results.

Disabling also gates the palette: a disabled package's node types stop appearing in the add-step
menu, and its views unmount.

## Variants

When two packages provide a step under the **same node identity**, the Package Manager shows a
**Contribution variants** section on the detail pane. Pick which provider is active (replace mode),
or keep several available side by side (coexist mode). For example, with `lsd-mim` and
`lsd-mim-openpit` both active, the openpit `pit_shell` step is offered as a variant of `mim.solid`.
Selecting one calls `engine.set_variant(identity, mode=, provider=)` and refreshes the pipeline.
See [Node variants](/docs/tools-variants).

## Default packages

Which packages activate on launch is configurable:

```bash
LSD_DEFAULT_PACKAGES=lsd-gis,lsd-mim # comma-separated, wins first
```

Otherwise the active **profile's** `default_packages` (in `~/.lsd/profiles.json`) applies. With
neither set, a bare launch defaults to **all available packages on** (opt out with
`LSD_DESKTOP_NO_AUTOLOAD=1`). A project that explicitly declares its packages is always respected.

## Add from a URL or GitHub

Beyond **Add local…** (register a folder by reference) and installing a `.zip` / `.lsdpkg`, the
**Add from URL…** action installs straight from the web:

```python
pm.install_url("https://github.com/acme/lsd-widgets") # a GitHub repo
pm.install_url("https://example.com/lsd-widgets.zip") # a direct archive
```

A GitHub repository URL is resolved to its archive and unpacked; a direct `.zip` or `.lsdpkg`
downloads and installs. Paid store packages are the exception — **Buy** opens the web store page in
your browser for checkout. See [Buy & install](/docs/pkg-store-install).

## Related

**Learn** — [Develop a package](/docs/pkg-develop) · [Node variants](/docs/tools-variants)

**API** — [PackageManager](/docs/api-package-manager) · [lsd_package.json](/docs/api-manifest)

**Examples** — [A complete package](/docs/ex-full-package)

## FAQ
### Does disabling a package delete anything?

No. Disabling is a project-scoped freeze — the package's steps keep their cached output and simply stop recomputing. Re-enable and the nodes recompute as normal. Only hand-installed packages have a remove action.

### How do I choose which packages load by default?

Set LSD_DEFAULT_PACKAGES (a comma-separated list) or a profile's default_packages in ~/.lsd/profiles.json. With neither set, a bare launch defaults to all available packages on.
